Bắt đầu từ C# 3.0, các biến khai thuộc bên trong các phương thức có thể được khai báo kiểu ngầm định bằng cách dùng từ khóa var. Một biến được khai báo bằng từ khóa này vẫn có kiểu cụ thể, chỉ khác là kiểu này được xác định tự động bởi trình dịch, hai câu khai báo sau là hoàn toàn tương đương:
Những ràng buộc sau được áp dụng khi một biến được khai báo bằng var:
- Biến phải được khởi tạo ngay khi khai báo.
- Câu lệnh khởi tạo phải là một biểu thức (tức phải có giá trị).
- Biểu thức khởi tạo phải có một kiểu không phải kiểu null..
- Câu lệnh khai báo không sử dụng cho việc khai báo nhiều biến đồng thời.
- Câu lệnh khởi tạo không được phép tham chiếu lại chính biến được khai báo.
Các ví dụ sau là không hợp lệ:
- var x; // Lỗi, không có câu lệnh khởi tạo
- var y = {1, 2, 3}; // Lỗi, câu lệnh khởi tạo không được phép là một tập hợp
- var z = null; // Lỗi, không được phép là kiểu null
- var u = x => x + 1; // Lỗi, biểu thức lambda không có kiểu
- var v = v++; // Lỗi, câu lệnh khởi tạo không được phép tham chiếu lại biến đang được khai báo
Chú ý:
Vì lý do tương thích, nếu bạn khai báo một biến bằng từ khóa var, và có một kiểu tên var đang tồn tại (in scope), kiểu var sẽ được dùng thay cho từ khóa var. Tuy nhiên trường hợp này có lẽ ít xảy ra vì tên kiểu var không đúng với quy ước đặt tên kiểu (chữ cái đầu mỗi từ phải là chữ hoa).
Các phát biểu for và using có thể dùng var, và biến được khai báo sẽ có cùng kiểu với biểu thức khởi tạo:
Ví dụ:
for (var i = 1; i <= 10; i++) //Biến i có kiểu int
using (var context = new MyDataContext()) //Biến context có kiểu MyDataContext
Ngược lại, nếu dùng var khi khai báo biến với vòng lặp foreach, biến này sẽ có kiểu của thành phần bên trong tập hợp được duyệt.
Ví dụ:
int[] numbers = { 1, 3, 5, 7, 9 }; foreach (var n in numbers) Console.WriteLine(n); //Biến n có kiểu int
Cũng như biểu thức lambda, bản thân var không phải là một thành phần của LINQ, tuy nhiên nó hỗ trợ LINQ trong việc giúp người dùng khai báo các câu truy vấn một cách đơn giản hơn.