Trong C #, từ khóa varhoạt động như thế nào?
Trong C #, từ khóa varhoạt động như thế nào?
Câu trả lời:
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:
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ề.
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.
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.
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ữ.
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.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
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.
var foo = new Foo(),foocó thể là loạiFoohoặ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?