2009-12-18 44 views
17

Tôi muốn sử dụng từ khóa var để khai báo một trường trong lớp của mình tuy nhiên var chỉ hoạt động bên trong phương thức.Sử dụng var bên ngoài phương thức

Mã Tôi có trông giống như:

public static Dictionary<string, string> CommandList = new Dictionary<string, string>{}; 

và tôi muốn có:

public static var CommandList = new Dictionary<string, string> 

Tại sao này là không thể?

+0

Bạn có gặp lỗi biên dịch không? Nó nói gì? –

+0

Không thể phân giải biểu tượng var. Dường như var không được nhận ra ngoài phương thức. –

Trả lời

30

Bài viết của tôi về đề tài này:

Why no var on fields?

Để tóm tắt:

  1. Nếu chúng ta có "var" lĩnh vực sau đó loại lĩnh vực này có thể không được xác định cho đến khi biểu thức được phân tích và điều đó xảy ra sau khi chúng tôi cần biết loại trường.

  2. Điều gì sẽ xảy ra nếu có chuỗi dài hoặc thậm chí là các chu kỳ trong các tham chiếu đó? Tất cả các thuật toán đó sẽ phải được viết lại và thử nghiệm trong một thế giới nơi thông tin loại cấp cao nhất đang được xác định từ chúng thay vì được tiêu thụ bởi chúng.

  3. Nếu bạn có trường "var" thì trình khởi tạo có thể thuộc loại ẩn danh. Giả sử trường là công khai. Vẫn chưa có bất kỳ chuẩn nào trong CLR hoặc CLS về cách thức đúng đắn để trưng ra một trường kiểu ẩn danh là gì.

+3

Bài viết đó là thứ tốt. Rất sâu về cách thức và lý do. –

0

Câu trả lời ngắn gọn là vì thông số nói rằng nó không hợp pháp. ;-)

Nói chung, đây không phải là điều bạn muốn làm. Loại thành viên phải là IDictionary<string, string> không phải là Dictionary<string, string>. Đó là một nit nhỏ nhưng nói chung nó là tốt hơn để sử dụng một giao diện trong một đối tượng bên ngoài có thể nhìn thấy, do đó bạn có thể thay đổi loại sau này mà không ảnh hưởng đến các khách hàng của mã. Trình biên dịch chỉ cho bạn một chút di chuyển để hướng dẫn bạn hướng đó.

+5

-1 không liên quan gì đến việc bạn đang sử dụng giao diện hay loại bê tông –

+4

-1 đồng ý với Pete. Lỗi là không có gì để làm với "được nudged đúng hướng" –

+0

Tôi đã không nói rằng nó đã làm. Tôi nói đó là vì thông số nói vậy. Không giống như Eric Lippert, tôi không thể đưa ra tuyên bố về TẠI SAO một sự lựa chọn đã được thực hiện khi tôi không ở đó. Tuy nhiên, tôi tin rằng ngay cả khi nó không khó như EL mô tả dưới đây, rằng họ đã chọn không vì lý do tôi liệt kê. Đó là một ý tưởng tồi để hiển thị thông tin nội bộ của loại thực tế trong một biến trong giao diện của một đối tượng. Và tôi đã gợi ý rằng câu hỏi đã dẫn đến một quyết định tồi tệ. Có lẽ quá tinh tế. –

6

Từ C# reference

  • Bắt đầu từ trong Visual C# 3.0, biến được tuyên bố tại phương pháp phạm vi có thể có một kiểu var ngầm.

Cũng từ The C# Programming Reference

  • 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 báo cáo kết quả tương tự; biến không thể được khởi tạo thành null, hoặc cho một nhóm phương thức hoặc một hàm ẩn danh.
  • var không thể được sử dụng trên các trường ở phạm vi lớp học.

Nó không chỉ dành cho việc sử dụng bạn có trong đầu.

Mục đích chính của nó là cho phép hỗ trợ các loại ẩn danh trong mã của bạn, với lợi thế bổ sung là cho phép một cách ngắn gọn để xác định các biến cục bộ.

+1

+1 để trích dẫn thông số và đưa ra tham chiếu – jcoder

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