2008-11-18 31 views
26

Khi C# 4.0 xuất hiện và chúng tôi có từ khóa động như được mô tả trong số excellent presentation by Anders Hejlsberg này, (C# đang phát triển nhanh hơn tôi có thể theo kịp .. Tôi không có nhiều thời gian để tự làm quen với từ khóa var)Từ khóa C# 4.0 'động' mới có phản đối từ khoá 'var' không?

Tôi vẫn cần từ khóa var? Có bất cứ điều gì mà var có thể làm .. năng động đó có thể không?

var x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList(); 
// do something with x 
+3

Có lẽ không quan trọng, nhưng trong khi var là từ khóa, động thì không. Đó là một loại. – TimothyP

+0

Vì vậy, nó 'năng động' về cơ bản giống như tuyên bố một cái gì đó của loại "đối tượng" nhưng trình biên dịch không phàn nàn, khi bạn gọi phương pháp trên nó mà không tồn tại? –

+1

Có, nó sẽ được giải quyết trong thời gian chạy. Nếu nó tồn tại, phương pháp sẽ được gọi .. nếu không Boom! – Gishu

Trả lời

72

Không, chúng rất khác nhau.

var có nghĩa là "phỏng đoán loại biến tại thời gian biên dịch" - nhưng nó vẫn hoàn toàn bị ràng buộc.

dynamic có nghĩa là "giả sử tôi có thể làm bất cứ điều gì tôi muốn với biến này" - nghĩa là trình biên dịch không biết những gì hoạt động có sẵn, và DLR sẽ làm việc ra những gì các cuộc gọi thực sự nghĩa ở thời gian thực hiện.

Tôi hy vọng sẽ sử dụng dynamic rất hiếm - chỉ khi tôi thực sự muốn hành vi động:

  • var cho phép bạn bắt lỗi chính tả vv tại thời gian biên dịch
  • đang tĩnh ràng buộc luôn luôn là sẽ chạy nhanh hơn so với động mã bị ràng buộc (ngay cả khi sự khác biệt trở nên hợp lý nhỏ)
  • mã giới hạn tĩnh cung cấp hỗ trợ biên dịch nhiều hơn chỉ là lỗi: bạn có thể tìm thấy phân cấp cuộc gọi, tái cấu trúc sẽ hoạt động tốt hơn, Intellisense có sẵn vv
+0

Đó là phần thiếu của tôi .. var là tĩnh ràng buộc (và do đó đi kèm với những lợi ích của biên dịch kiểm tra thời gian, dụng cụ, vv) – Gishu

+1

bạn về cơ bản có thể nghĩ về var như một số cú pháp đường –

17

Động và var đại diện cho hai ý tưởng hoàn toàn khác nhau.

var

Var về cơ bản yêu cầu trình biên dịch để hình dung ra kiểu của biến dựa trên các biểu hiện ở phía bên tay phải của câu lệnh gán. Biến này sau đó được xử lý chính xác như thể nó được khai báo một cách rõ ràng là loại biểu thức. Ví dụ hai câu sau đây là tương đương

var a = "foo"; 
string a = "foo"; 

Chìa khóa để lấy đi ở đây là "var" là 100% type an toàn và là một hoạt động thời gian biên dịch

động

động là theo nhiều cách ngược lại với var. Sử dụng năng động cơ bản loại bỏ tất cả các loại an toàn cho các biến cụ thể. Nó có nhiều cách nó không có loại. Khi bạn gọi một phương thức hoặc trường trên biến, xác định về cách gọi trường đó xảy ra khi chạy. Ví dụ

dynamic d = SomeOperation(); 
d.Foo(); // Will this fail or not? Won't know until you run the program 

Chìa khóa để lấy đi ở đây là "năng động" không phải là loại an toàn và là một hoạt động thời gian chạy

+2

Nó vẫn loại an toàn, nó chỉ rằng loại không được biết tại thời gian biên dịch. Nếu đối tượng thực tế (thời gian chạy) không có một thành viên cụ thể mà bạn đang cố gắng truy cập, bạn sẽ nhận được ngoại lệ. –

+0

So sánh: bạn có thể sử dụng var trong .NET 2.0 Projects. Không năng động. –

1

Có bạn vẫn sẽ cần var:

Var là một biến loại của trình biên dịch sẽ được suy ra.
động sẽ loại của nó được gán khi chạy

Vì vậy:

Var i = "Hello World" 

sẽ có loại này suy ra như một kiểu chuỗi khi làm như vậy intellisence sẽ cung cấp cho bạn tất cả các phương pháp mà chuỗi có thể sử dụng như ,

i.Split("/") 

Trong trường hợp như:

dynamic i = "Hello World" 

sẽ không có loại suy ra thời gian chạy cho đến khi nó bởi vì trình biên dịch Dosn't biết loại đó là nêu ra, nhưng vẫn sẽ cho phép bạn làm:

i.Split("/") 

nhưng khi nó gọi phương thức mà bạn cần nó có thể thất bại vì loại sai và phương thức không có ở đó.

+0

Pedant: "var" là biến * có loại sẽ được trình biên dịch phỏng đoán. Đối tượng không bị ảnh hưởng. "dynamic" là một biến được gõ tĩnh là "động" - đó là cơ chế gửi mà thay đổi (biến vẫn được gõ là "động"). –

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