2011-02-16 51 views
14

thể trùng lặp:
What's the point of the var keyword?Mục đích của 'var' là gì?

Tôi không hỏi làm thế nào nó hoạt động. Tôi đang không phải hỏi xem nó có ảnh hưởng đến hiệu suất hay không. Tôi đã biết những câu trả lời đó rồi.

Tôi muốn biết điều gì đã truyền cảm hứng cho nhóm MS C# để thêm nó vào ngôn ngữ ngay từ đầu. Bạn không thêm những thứ phù phiếm vào một ngôn ngữ. Phải có một vấn đề đáng chú ý mà nó giải quyết được. Vấn đề là gì?

Ví dụ gần nhất tôi đã nhìn thấy "vấn đề nó giải quyết" được khi sử dụng các loại vô danh, như thế này:

var linqResult = from element in SomeCollection s 
       elect new { element.A, element.B }  

Sự trớ trêu về việc sử dụng này là phong cách và mã hóa-tiêu chuẩn hướng dẫn (ví dụ như do Microsoft cung cấp) khuyên người lập trình nên tránh sử dụng 'var' khi loại kết quả không rõ ràng. Nói cách khác, mục đích (có lẽ) nhằm mục đích của 'var' là mâu thuẫn với các nguyên tắc tiêu chuẩn mã hóa.

Nếu tôi đang viết các tiêu chuẩn mã hóa và cố gắng ngăn chặn lạm dụng 'var', tôi có khuynh hướng nói "sử dụng" var "chỉ để trả lời các loại ẩn danh". Nhưng điều đó mang lại cho câu hỏi toàn vòng tròn: những gì đã là/là mục đích của việc thêm 'var' vào ngôn ngữ?

+0

bạn thực sự đã trả lời câu hỏi của bạn.'var' đã được giới thiệu để hỗ trợ các kiểu ẩn danh, bởi vì không có cách nào khác để có biến kiểu ẩn danh. – Andrey

+0

Bạn đã có câu trả lời: mục đích ban đầu là xử lý các loại ẩn danh. –

+0

@David - Bingo, tôi đang tìm kiếm điều đó. – ChaosPandion

Trả lời

14

loại Anonymous là lớn nhất, nhưng cũng làm giảm sự lặp lại trong các phương pháp:

Dictionary<MyCustomType, List<MyOtherCustomType>> dict = new Dictionary<MyCustomType, List<MyOtherCustomType>>(); 
+1

Có. Đây là trường hợp khi ** hiển nhiên ** loại biến đó là gì. Do đó nó có thể được sử dụng trong kịch bản này (mặc dù tôi không). –

+0

@Robert Đó là một quyết định mang tính phong cách và một tùy chọn. Đối với Repetitions, tôi luôn sử dụng nó (type x = new type()), nhưng Method Calls là một trường hợp quyết định. –

7

Chính xác! Các loại ẩn danh. Làm thế nào trên thế giới bạn sẽ giữ một tham chiếu đến một loại vô danh được tạo ra nếu không có var và vẫn có intellisense cùng với nó?

Nói cách khác: Khi không có var, sẽ không có bất kỳ loại ẩn danh nào theo ý nghĩa có thể sử dụng mà chúng tôi hiện có với hỗ trợ thời gian biên dịch. Sẽ có quá nhiều lỗi thời gian chạy với các loại ẩn danh.

Đã thêm đường (độ phức tạp khi bị lạm dụng) là bạn có thể sử dụng var với các biến số không ẩn danh. Chắc chắn nó hoạt động nhưng đó là một thói quen xấu.

+1

Bạn muốn sử dụng một đối tượng, nhưng nhược điểm là bạn sẽ không có intellisense. –

+0

@Yuriy: Bạn sẽ không chỉ không có Intellisense, nhưng cũng không có Thuộc tính - loại ẩn danh trong ví dụ OP có hai thuộc tính: .A và .B. Bạn không thể truy cập System.Object.A vì Object không có thuộc tính này, vì vậy bạn cần phải cast nó. Bỏ nó vào cái gì? Trong .net 4, năng động có thể giải quyết điều đó, nhưng .net 3 không có điều đó. –

+1

@Michael: chắc chắn tôi có thể, thông qua sự phản ánh. Tôi thực sự không muốn. –

1

Theo như tôi biết từ khóa var đã được thực hiện khá nhiều để làm cho LINQ easierby cho phép sử dụng các loại vô danh

+2

var không có gì để kích hoạt LINQ. –

0

Từ MSDN:

Trong nhiều trường hợp việc sử dụng var là tùy chọn và chỉ là một cú pháp tiện lợi. Tuy nhiên, khi một biến được khởi tạo với một loại vô danh , bạn phải khai báo biến là var nếu bạn cần truy cập vào các thuộc tính của đối tượng tại điểm sau này. là một kịch bản phổ biến trong truy vấn LINQ .

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