Sau khi thảo luận với các đồng nghiệp về việc sử dụng từ khóa 'var' trong C # 3, tôi tự hỏi ý kiến của mọi người về cách sử dụng suy luận kiểu thông qua var là gì?
Ví dụ: tôi khá lười sử dụng var trong các trường hợp nghi vấn, ví dụ: -
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
Việc sử dụng var hợp pháp hơn như sau: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Thú vị là LINQ dường như là một chút của một khu vực màu xám, ví dụ: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Rõ ràng kết quả sẽ là gì khi nó sẽ là một kiểu thực hiện IEnumerable, tuy nhiên nó không hoàn toàn rõ ràng giống như cách một var khai báo một đối tượng mới.
Thậm chí còn tệ hơn khi nói đến LINQ cho các đối tượng, ví dụ: -
var results = from item in someList
where item != 3
select item;
Điều này không tốt hơn so với foreach tương đương (mục var trong someList) {// ...} tương đương.
Có một mối quan tâm thực sự về an toàn kiểu ở đây - ví dụ: nếu chúng ta đặt kết quả của truy vấn đó vào một phương thức quá tải chấp nhận IEnumerable <int> và IEnumerable <double> thì người gọi có thể vô tình chuyển nhầm loại.
var
không duy trì kiểu gõ mạnh nhưng câu hỏi thực sự là liệu nó có nguy hiểm khi loại không rõ ràng ngay lập tức về định nghĩa hay không, điều gì đó được phóng to khi quá tải có nghĩa là lỗi trình biên dịch có thể không được đưa ra khi bạn vô tình chuyển sai loại cho phương thức.
var i = 0;
== thất bại! var c = new CrazyFrigginLongClassName();
== thắng!
var readabilityBeDamned = true;