Xác định rõ ràng các loại dữ liệu biến so với sử dụng từ khóa 'var'? [đóng cửa]


35

Trong C #, tôi có được khuyến khích sử dụng từ khóa var đa mục đích cho mỗi khai báo biến không? Nếu có, tôi có phải đề cập đến các ký tự đặc biệt cho các giá trị bằng chữ trong khai báo biến như M cho số thập phân trong câu lệnh sau:

var myDecimal = 14.5M;

Nếu nó tạo ra sự khác biệt, tôi đang cố gắng thực hiện một số phát triển web với C #.


7
Có hàng tá bản sao tại SO (nơi thuộc về IMHO).

1
Những câu hỏi tương tự đang đến với C ++ với việc tái sử dụng C ++ 0x auto.
David Thornley

5
Eric Lippert của nhóm trình biên dịch C # gần đây đã viết về điều này: blog.msdn.com/b/ericlippert/archive/2011/04/20/ Kẻ
Tim Goodman

Có sáu tỷ bản sao của câu hỏi này.
DeadMG

@DeadMG kiếm được sáu tỷ và một.
wassimans

Câu trả lời:


53

Đã có rất nhiều tranh chấp về việc sử dụng var. Quy tắc chung của tôi là như sau.

  • Khi kiểu này là rõ ràng, chẳng hạn như khi bên phải của bài tập là một hàm tạo, sử dụng var.
  • Khi loại phức tạp để viết, chẳng hạn như truy vấn LINQ (lý do cho var ở vị trí đầu tiên) sử dụng var.
  • Đối với các kiểu không rõ ràng (Số thập phân của bạn là một ví dụ) trong đó bạn muốn đảm bảo rằng biến của bạn được nhập chính xác, hãy đánh vần nó.
  • Các loại ẩn danh phải sử dụng var.
  • Trong tất cả các trường hợp khác đánh vần các loại.

Về cơ bản, mục tiêu là để đọc mã dễ dàng hơn. Nếu bạn cảm thấy var đủ vì sự phân công rõ ràng, hãy sử dụng var. Sử dụng tên đầy đủ làm gợi ý cho người đọc khi bạn cảm thấy cần thiết.


9
Tôi cũng sử dụng 'var' trong các foreachcâu lệnh mà tôi chỉ quan tâm đến việc liệt kê một bộ sưu tập, không nhất thiết là về loại của mỗi mục.
Adam Lear

1
Và như Jesse đã chỉ ra các loại ẩn danh;)
Michael Brown

4
@AnnaLear đôi khi bạn phải quan tâm mặc dù. foreach (var row in datitable.Rows) trong trường hợp này var là một đối tượng không phải là DataRow như người ta mong đợi.
Thanos Papathanasiou

@ThanosPapathanasiou Chắc chắn, vâng. Điều tương tự cũng xảy ra với bộ sưu tập Điều khiển trong Windows Forms và có lẽ các tình huống khác nữa.
Adam Lear

Tôi thường sử dụng var trừ khi tôi muốn chắc chắn về loại biến của mình (như khi tôi muốn chắc chắn rằng giá trị là gấp đôi chẳng hạn)
eka808

14

Khi sử dụng varlà một chương trình "thánh chiến". Có chính xác một nơi mà nó được yêu cầu: khi kết quả của một hoạt động tạo ra một loại ẩn danh, chẳng hạn như:

var result = new { Name = "John", Age = 35 };

Bất cứ nơi nào khác, nó là tùy chọn và thực sự theo tiêu chuẩn mã hóa của bạn để sử dụng nó hay không trong các tình huống khác.

Và vâng, bạn sẽ cần các ký tự đặc biệt cho chữ để cho trình biên dịch biết nó ở phía bên tay phải. Trong ví dụ của bạn, không có M, mặc định là doublehơn decimal.


1
quên tất cả về các loại ẩn danh!
Michael Brown

Ở công việc cuối cùng của tôi, tôi được cho biết là tôi sẽ bị sa thải nếu tôi tiếp tục sử dụng từ khóa "var" ...
hanzolo

Điều đó cực kỳ, nhưng sáng kiến ​​của công ty bạn. Mặc dù vậy, rất vui vì đó là công việc "cuối cùng" của bạn! :)
Jesse C. Choper

7

Từ MSDN :

Tuy nhiên, việc sử dụng var ít nhất có khả năng làm cho mã của bạn trở nên khó hiểu hơn đối với các nhà phát triển khác. Vì lý do đó, tài liệu C # thường chỉ sử dụng var khi được yêu cầu.

Tôi thực sự, thực sự không thích gõ ngầm. Nhìn bề ngoài, nó có xu hướng làm cho mã dễ đọc hơn, nhưng có thể dẫn đến nhiều vấn đề trong quá trình sử dụng. Nếu một nhà phát triển thay đổi một trình khởi tạo biến, giả sử, từ

var myFloat=100f;

đến

var myFloat=100;

hoặc là

var myFloat=100.0;

Loại sẽ thay đổi, dẫn đến toàn bộ hàng loạt lỗi biên dịch hoặc, nếu nó ở chế độ xem web và bạn không sử dụng bước hậu xây dựng để biên dịch trước các chế độ xem của mình, toàn bộ lỗi thời gian chạy sẽ không bị bắt mà không có hiệu quả thử nghiệm trước khi triển khai.

Gõ ngầm cũng không hoạt động ở mọi nơi (từ cùng một liên kết MSDN)

var chỉ có thể được sử dụng khi một biến cục bộ được khai báo và khởi tạo trong cùng một câu lệnh; biến không thể được khởi tạo thành null hoặc nhóm phương thức hoặc hàm ẩn danh.

var không thể được sử dụng trên các trường ở phạm vi lớp.

Các biến được khai báo bằng cách sử dụng var không thể được sử dụng trong biểu thức khởi tạo. Nói cách khác, biểu thức này là hợp pháp: int i = (i = 20); nhưng biểu thức này tạo ra lỗi thời gian biên dịch: var i = (i = 20);

Nhiều biến được gõ ngầm định không thể được khởi tạo trong cùng một câu lệnh.

Nếu một loại có tên var nằm trong phạm vi, thì từ khóa var sẽ phân giải thành tên loại đó và sẽ không được coi là một phần của khai báo biến cục bộ được gõ ngầm.

Giữ mã của bạn nhất quán (trong trường hợp này, sử dụng gõ rõ ràng ở mọi nơi) là một điều rất, rất tốt. Theo tôi, varlười biếng và không mang lại lợi ích thực sự, và đưa ra một điểm thất bại tiềm năng khác trong một quy trình vốn đã phức tạp.

Cập nhật 2017

Tôi hoàn toàn thay đổi suy nghĩ của mình. Khi làm việc trong C #, tôi sử dụng varhầu hết thời gian (ngoại trừ những thứ như biến kiểu giao diện, v.v.). Nó giữ mã terse giúp cải thiện khả năng đọc. Tuy nhiên, mặc dù - chú ý đến loại giải quyết thực sự là gì.


Tự hỏi điều gì đã thay đổi tâm trí của bạn, @ 3Dave. Tôi vẫn đồng ý 100% với quan điểm ban đầu của bạn: "var lười biếng và không mang lại lợi ích thực sự, và giới thiệu một điểm thất bại tiềm năng khác trong một quy trình vốn đã phức tạp".
Dan

@Dan Nó thực sự đi xuống dễ đọc. Một nhà phát triển có thẩm quyền có thể nhanh chóng xác định những gì ở phía khởi tạo của một tuyên bố mà không có vấn đề. Cũng giống như không sử dụng this.ở mọi nơi, hoặc nói System.Blah.SomeTypethay vì một using, điều mà tôi vẫn thấy cực kỳ khó chịu, mã ngắn gọn hơn - ít nhất là đối với tôi - thường dễ dàng hơn để phân tích trực quan. Vẫn còn nhiều tình huống trong đó gõ rõ ràng là lựa chọn đúng đắn. Nhưng, những ngày này tôi không phải là một luật sư ngôn ngữ hơn là một người chỉ cố gắng lấy mã sạch ra khỏi cửa.
3Dave

@Dan (Tất nhiên, tôi cũng là người sử dụng using namespace std;các tệp .cpp. (Không phải tiêu đề, vì tôi muốn tránh bị dính nhựa đường và lông vũ.)
3Dave

3

Tham chiếu C # hiển thị như sau để minh họa việc sử dụng tốt và xấu của cấu trúc này:

Ví dụ sau đây cho thấy hai biểu thức truy vấn. Trong biểu thức đầu tiên, việc sử dụng var được cho phép nhưng không bắt buộc, vì loại kết quả truy vấn có thể được nêu rõ ràng dưới dạng IEnumerable. Tuy nhiên, trong biểu thức thứ hai, var phải được sử dụng vì kết quả là một tập hợp các loại ẩn danh và tên của loại đó không thể truy cập được ngoại trừ chính trình biên dịch. Lưu ý rằng trong ví dụ # 2, mục biến lặp foreach cũng phải được gõ ngầm.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }

0

Từ khóa var chỉ yêu cầu trình biên dịch tự động suy ra loại biến var. Do đó, nếu bạn muốn lưu trữ một biến loại thập phân trong một biến var, bạn cần sử dụng m. Tương tự như vậy nếu bạn đang lưu trữ một chuỗi, bạn cần đặt nó trong dấu ngoặc kép.


0

Đối với tôi, tôi không sử dụng var cho các trường hợp sau:

  • Khi tôi muốn chắc chắn về loại biến của mình (ví dụ để chắc chắn rằng loại được sử dụng là gấp đôi và không phải là số thập phân, và đây là một vấn đề lớn tin tưởng tôi!)
  • Mã đa hình như thế nào Fruit foo = new Apple();. Trong trường hợp này, tôi nghĩ var là để tránh và sử dụng lớp cha (ở đây Fruit) tốt hơn bằng cách cho phép hiểu rõ hơn về logic mã và giới hạn của các lỗi có thể xảy ra (Với var, không kiểm tra khái niệm đa hình!)

Đối với phần còn lại, tôi nghĩ rằng nó phụ thuộc vào trường hợp và nền tảng của nhà phát triển. Một số người từ thế giới PHP sẽ không thích quan tâm đến các kiểu biến và một số người từ thế giới Java sẽ chỉ nghĩ var là một dị giáo và càng dài thì càng tốt.

Bạn sẽ phải đưa ra ý kiến ​​cá nhân của mình :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.