“Var” có nghĩa là gì trong C #? [bản sao]


Câu trả lời:


159

Có nghĩa là loại cục bộ được khai báo sẽ được trình biên dịch suy ra:

// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";

Đáng chú ý, varkhông xác định một biến có kiểu động. Vì vậy, điều này KHÔNG hợp pháp:

var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints

var chỉ có hai công dụng:

  1. Nó yêu cầu ít nhập hơn để khai báo các biến, đặc biệt khi khai báo một biến là một kiểu chung lồng nhau.
  2. Nó phải được sử dụng khi lưu trữ một tham chiếu đến một đối tượng thuộc kiểu ẩn danh, vì không thể biết trước tên kiểu: var foo = new { Bar = "bar" };

Bạn không thể sử dụng varnhư một loại bất cứ điều gì ngoài người dân địa phương. Vì vậy, bạn không thể sử dụng từ khóa varđể khai báo các kiểu trường / thuộc tính / tham số / trả về.


@cdhowie gì nếu trong khi nói, var foo = new Foo(), foocó thể là loại Foohoặc bất kỳ của các tầng lớp siêu của nó. Làm thế nào mà có thể là bất kỳ hợp pháp?
— John Strood

3
@Djack Nó không hợp pháp, và không phải vậy. var foo = new Foo();là điều tương tự như Foo foo = new Foo();, có nghĩa là foocó thể chứa một Footài liệu tham khảo, hoặc một tham chiếu đến một đối tượng bất kỳ Foo tiểu loại, không một Foo siêu loại.
— cdhowie

15

Nó có nghĩa là kiểu dữ liệu được bắt nguồn (ngụ ý) từ ngữ cảnh.

Từ http://msdn.microsoft.com/en-us/library/bb383973.aspx

Bắt đầu trong Visual C # 3.0, các biến được khai báo ở phạm vi phương thức có thể có kiểu ẩn var. Một biến cục bộ được định kiểu ngầm sẽ được nhập mạnh giống như thể bạn đã tự khai báo kiểu, nhưng trình biên dịch xác định kiểu. Hai khai báo sau của i là tương đương về mặt chức năng:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

var rất hữu ích để loại bỏ tiếng gõ bàn phím và tiếng ồn hình ảnh, ví dụ:

MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

trở thành

var x = new MyReallyReallyLongClassName();

nhưng có thể bị lạm dụng đến mức khả năng đọc bị hy sinh.


9

"var" có nghĩa là trình biên dịch sẽ xác định kiểu rõ ràng của biến, dựa trên cách sử dụng. Ví dụ,

var myVar = new Connection();

sẽ cung cấp cho bạn một biến kiểu Kết nối.


7

Nó khai báo một kiểu dựa trên những gì được gán cho nó trong quá trình khởi tạo.

Một ví dụ đơn giản là mã:

var i = 53;

Sẽ kiểm tra loại 53 và về cơ bản viết lại nó như sau:

int i = 53;

Lưu ý rằng mặc dù chúng ta có thể có:

long i = 53;

Điều này sẽ không xảy ra với var. Mặc dù nó có thể với:

var i = 53l; // i is now a long

Tương tự:

var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.

Đây có thể là một sự tiện lợi nhỏ với các loại phức tạp. Nó quan trọng hơn với các loại ẩn danh:

var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
  Console.WriteLine(j.ID.ToString() + ":" + j.Name);

Ở đây không có cách nào khác để xác định ivà jsử dụng varvì không có tên cho các loại mà chúng nắm giữ.


5

Bạn có bao giờ ghét phải viết những bộ khởi tạo biến như vậy không?

XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

Vì vậy, bắt đầu với C # 3.0, bạn có thể thay thế nó bằng

var xmlSerializer = new XmlSerialzer(typeof(int))

Một thông báo: Loại được giải quyết trong quá trình biên dịch, vì vậy không có vấn đề gì với hiệu suất. Nhưng Trình biên dịch sẽ có thể phát hiện loại trong bước xây dựng, vì vậy mã như var xmlSerializer;sẽ không được biên dịch.


0
  • Như tên được đề xuất, var là biến không có bất kỳ kiểu dữ liệu nào.
  • Nếu bạn không biết kiểu dữ liệu nào sẽ được trả về bằng bất kỳ phương thức nào, thì những trường hợp như vậy rất tốt để sử dụng var.
  • var là kiểu ngầm có nghĩa là hệ thống sẽ tự định nghĩa kiểu dữ liệu. Trình biên dịch sẽ suy ra kiểu của nó dựa trên giá trị ở bên phải của toán tử "=".
  • int / string, v.v. là các kiểu rõ ràng vì nó được bạn định nghĩa một cách rõ ràng.
  • Var chỉ có thể được định nghĩa trong một phương thức như một biến cục bộ
  • Nhiều vars không thể được khai báo và khởi tạo trong một câu lệnh. Ví dụ, var i = 1, j = 2; không có hiệu lực.
int i = 100;// explicitly typed 
var j = 100; // implicitly typed

0

var là một "từ khóa theo ngữ cảnh" trong C # có nghĩa là bạn chỉ có thể sử dụng nó như một biến cục bộ ngầm trong ngữ cảnh của cùng một lớp mà bạn đang sử dụng biến. Nếu bạn cố gắng sử dụng nó trong một lớp mà bạn gọi từ "Chính" hoặc một số lớp bên ngoài khác hoặc một giao diện chẳng hạn, bạn sẽ gặp lỗi CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >

Xem nhận xét về thời điểm bạn có thể và không thể sử dụng nó trong tài liệu tại đây: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicit-typed -local-biến # nhận xét >

Về cơ bản, bạn chỉ nên sử dụng điều này khi bạn đang khai báo một biến có giá trị ngầm định như "var myValue =" Đây là giá trị "; Điều này tiết kiệm một chút thời gian so với nói" chuỗi "chẳng hạn nhưng IMHO không nhiều thời gian. đã lưu và đặt ra hạn chế về khả năng mở rộng dự án của bạn.

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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.