2011-11-20 40 views
5

Tôi đã tìm hiểu và kiểm tra các lợi thế của dynamic từ khóa trong C# 4.Ưu điểm và nhược điểm của từ khóa 'động' 4.0?

Bất kỳ cơ thể nào cũng có thể cho tôi biết những bất lợi của điều này. Có nghĩa là dynamicVar/Object/reflection ???

Điều nào bị đập nhiều hơn. Có phải dynamic mạnh hơn vào thời gian chạy không ??

+3

Var/reflection không chính xác. Var là biến đánh máy ngầm được đánh giá tại thời gian biên dịch. Phản ánh mặt khác là thời gian chạy được đánh giá. Tôi nghĩ rằng sự phản chiếu sẽ đứng vững hơn về mặt năng động hơn là var. –

+0

Chúng tôi thực sự không thể nói rằng những gì bạn biết là đủ nếu bạn không cho chúng tôi biết những gì bạn biết. Các lợi thế là gì? Vui lòng thêm thông tin này vào câu hỏi. –

Trả lời

2

Không chính xác var so với động nhưng liên kết SO sau thảo luận về phản chiếu so với động. Trả phòng: dynamic vs Var/Object/reflection

13

Một trong những điều thú vị nhất với dynamic từ khóa mà bạn có thể làm là: triển khai công văn kép. Trong OOP, vào thời gian chạy, một phương thức ảo (hoặc trừu tượng) cụ thể được gọi, dựa trên kiểu thời gian chạy là một đối tượng được chuyển thành this cho hàm thành viên. Điều đó được gọi là công văn đơn, vì công văn phụ thuộc vào loại thời gian chạy là đối tượng đơn. Trong công văn kép, tùy thuộc vào loại đối tượng hai đối tượng.

Dưới đây là một ví dụ:

public abstract class Base {} 
public class D1 : Base {} 
public class D2 : Base {} 
public class D3 : Base {} 

public class Test 
{ 
    public static void Main(string[] args) 
    { 
     Base b1 = new D1(); 
     Base b2 = new D2(); 

     Method(b1,b2); //calls 1 
     Method(b2,b1); //calls 1: arguments swapped! 
    } 

    public static void Method(Base b1, Base b2) // #1 
    { 
     dynamic x = b1; 
     dynamic y = b2; 

     Method(x,y); // calls 2 or 3: double-dispatch - the magic happens here! 

    } 
    public static void Method(D1 d1, D2 d2) // #2 
    { 
     Console.WriteLine("(D1,D2)"); 
    } 
    public static void Method(D2 d2, D1 d1) // #3: parameters swapped 
    { 
     Console.WriteLine("(D2,D1)"); 
    } 
} 

Output:

(D1,D2) 
(D2,D1) 

Đó là, phương pháp thực tế được chọn trong thời gian chạy, dựa trên loại thời gian chạy của hai đối tượng, như trái ngược với một đối tượng.

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