– Trong bài viết này, chúng ta sẽ cùng thảo luận về cách khai báo biến kiểu ngầm định (Implicitly Typed Local Variable). Trước khi đi vào chi tiết chúng ta cùng xem một ví dụ sau đây:
namespace MinhHoangBlog { class Program { static void Main(string[] args) { // Khởi tạo đối tượng person Person person = new Person(); person.name = "minhhn.com"; person.age = 3; } } class Person { public string name { get; set; } public int age { get; set; } } }
– Ở ví dụ trên khi khởi tạo đối tượng person, cần khai báo một biến person trỏ tới kiểu dữ liệu Person thì phải sử dụng 2 lần tên kiểu dữ liệu Person, đây là một sự trùng lặp không cần thiết. Giả sử sau này chúng ta muốn thay đổi class Person thành MyPerson thì phải sửa đổi tên kiểu dữ liệu ở 2 chỗ. Để tránh tình trạng này thì C# 3.0 hỗ trợ keyword var. Khi đó, chúng ta có thể viết thành:
var person = new Person();
Vậy tại sao lại gọi là Khai báo biến kiểu ngầm định?
– Khai báo biến kiểu ngầm định (khai báo không tường minh) là biến được khai báo mà không cần phải chỉ ra kiểu dữ liệu. Kiểu dữ liệu của biến sẽ được xác định bởi trình biên dịch dựa vào biểu thức được gán khi khai báo biến.
– Trước kia ở C# 1.x và 2.0, khi muốn khai báo 1 biến, bạn phải theo cú pháp là:
<kiểu biến> <tên biến> = <giá trị ban đầu>; int i = 3;
– Với C# 3.0, từ khoá var cho phép định nghĩa một biến mà không cần khai báo kiểu tường minh, như ví dụ dưới đây là hợp lệ trong C# 3.0
var x = 3;
※ Khi khai báo biến sử dụng từ khoá var thì kiểu dữ liệu của biến được xác định bởi biểu thức được gán vào biến. Ví dụ trên thì biến x sẽ có kiểu là int.
– Nếu chúng ta khởi tạo biến x là một kiểu string như sau:
var x = "minhhn.com";
※ Và do x là kiểu string, nên các function cũng sẽ thay đổi theo:
– Bạn có thể khai báo các trường hợp khác như sau:
var d = 1.0; var arr = new int[] { 1, 2, 3 }; var list = new List<string>(); var dic = new Dictionary<int, Person>(); //...
Một số điểm cần chú ý khi sử dụng
#1/5:
Không thể khởi tạo giá trị là null.
var person = null; // ERROR
・Vì khi compiler, trình biên dịch của C# sẽ không hiểu được bạn đang định sử dụng kiểu dữ liệu nào cho biến x. Có một cách có thể làm như sau là OK:
var person = (Person)null;
・Tuy nhiên đừng bao giờ sử dụng cách này, nó không phải là cách đường đường chính chính để mà đạt được mục đích :D. Do đó, nếu bạn thực sự muốn khai báo là null thì hãy sử dụng theo cách thông thường:
Person person = null;
#2/5:
Biến phải được khởi tạo giá trị khi nó được khai báo.
var x; // ERROR
#3/5:
Nếu biến được gán giá trị, thì kiểu dữ liệu phải giống nhau
var x = 3; x = "minhhn.com"; // ERROR
#4/5:
Giá trị khởi tạo phải là một biểu thức. Giá trị khởi tạo không được là một đối tượng hay tập hợp các giá trị. Nhưng nó có thể sử dụng toán tử new bởi một đối tượng hoặc tập hợp các giá trị. Bạn không thể gán giá trị khởi tạo là một dãy dữ liệu.
var x = { 1, 2, 3 }; // ERROR var x = new[] { 1, 2, 3 }; // OK
#5/5:
Không thể sử dụng từ khóa var bên ngoài phạm vi của một method (còn đối với từ khóa dynamic thì OK). Bắt buộc phải sử dụng var bên trong body của một method.
Q & A
1. Tại sao chúng ta cần dùng var, trong khi có thể khai báo biến với một kiểu dữ liệu cụ thể?
=> Đúng, chúng ta không cần dùng var nếu chúng ta biết loại dữ liệu được dùng. Và nó cũng không được thiết kế cho mục đích đó. Nếu bạn biết loại dữ liệu thì dùng loại dữ liệu đó.
2. Khi tôi viết “var i = 3;” thì trình biên dịch sẽ hiểu biến i có giá trị kiểu int? Nhưng tôi muốn khai báo nó là kiểu long. Làm thế nào để trình biên dịch biết i là kiểu long, cũng như các kiểu ulong, uint?
=> Ở đây, câu hỏi này cũng giống như câu hỏi đầu tiên. Nếu bạn đã biết loại dữ liệu thì không cần dùng var. Tuy nhiên, bạn vẫn có thể khai báo như sau:
var ui = 1U; // uint var l = 42L; // long var big = 1234567890UL; // ulong var pi = 3.1416; // double var size = 12.5F; // float var price = 27.99M; // decimal
Tổng kết
– Khai báo biến kiểu ngầm định, không tường minh (Implicitly Typed Local Variables) không phải là kiểu object hoặc variant.
– “var” giống như là nơi giữ chỗ để trình biên dịch thay thế kiểu dữ liệu thực sự dựa vào giá trị được gán.
– Bạn không nên dùng Implicitly Typed Local Variable nếu bạn biết loại dữ liệu.
– Implicitly Typed Local Variables là một đặt tính hay khi bạn làm việc với Anonymous Type hoặc LINQ.
[…] tính năng khai báo kiểu ẩn danh (Anonymous Type) chung với var (xem bài tính năng Khai báo biến kiểu ngầm định (Implicitly Typed Local Variable)). Nếu chúng ta không làm vậy mà sử dụng type object thay thế cho var thì khi […]
Nice post. Thank anh.