2016-05-11 16 views
5

Do bên dưới giao diện điều khiển chương trình:Tại sao Action.Method.IsStatic khác nhau giữa Visual Studio 2013 và năm 2015 đối với lambda nhất định biểu thức

class Program 
{ 
    private static string _value; 
    static void Main(string[] args) 
    { 
     var t = new Action(() => _value = "foo"); 
     Console.Out.WriteLine("t.Method.IsStatic: {0}", t.Method.IsStatic); 
    } 
} 

Khi biên dịch chống lại Net 4.5.2 sử dụng VS 2013, nó sẽ in

t.Method.IsStatic: true 

Khi biên dịch chống lại Net 4.5.2 sử dụng VS 2015, nó sẽ in

t.Method.IsStatic: false 

Từ this câu hỏi, tôi hiểu những gì đang xảy ra, nhưng tôi bối rối tại sao có sự thay đổi trong hành vi giữa các phiên bản của VS. Từ sự hiểu biết của tôi, sản lượng 2013 là chính xác.

Trả lời

4

Kiểm tra câu trả lời trong các liên kết sau đây: Delegate caching behavior changes in Roslyn

Về cơ bản những gì đã thay đổi và tôi trích dẫn @Yuzal từ câu trả lời liên quan:

"Đại biểu caching hành vi đã được thay đổi trong Roslyn Trước đây, như . tuyên bố, bất kỳ biểu thức lambda mà không nắm bắt các biến được biên dịch thành một phương pháp tĩnh tại trang web cuộc gọi. lớp splay: "

Và theo lớp hiển thị, anh ấy có nghĩa là một lớp được cá nhân hóa được tạo ra trong đó đóng gói phương thức thể hiện được gọi bởi đại biểu hành động.

Tại sao thay đổi được thực hiện? Trích dẫn @Kevin Pilch-Bisson (một thành viên của # IDE nhóm C):

Lý do nó nhanh hơn là vì gọi đại biểu được tối ưu hóa cho phương pháp dụ và có không gian trên stack cho họ. Để gọi một phương thức tĩnh , chúng phải thay đổi các tham số xung quanh.

Vì vậy, về cơ bản nhận xét là tự giải thích. Sự khác biệt về hành vi mà bạn thấy trong ví dụ trên là vì họ nhận thấy rằng nếu delegate Action gọi các phương thức instance của nó nhanh hơn việc gọi các phương thức tĩnh bất kể lambda có nắm bắt các biến hay không.

+0

Yup, đó là vấn đề. Thật không may, điều này gây ra vấn đề lạ nếu bạn sử dụng WeakReferences. – MattS

+0

@MattS hmmm, bạn có thể xây dựng trên đó không? –

+0

@MattS Khi bạn dựa vào hành vi không có giấy tờ, bạn nên mong đợi các vấn đề. – svick

0

Nó sẽ xuất hiện từ this rằng hành vi đã thay đổi giữa trình biên dịch năm 2013 và Rosyln. Rất phiền phức.

Các vấn đề liên quan