Các biến Constant và ReadOnly (const và readonly) trong C# làm cho 1 biến mà giá trị không thể bị thay đổi. Từ khóa static thì được sử dụng để tạo ra biến tĩnh chia sẻ giá trị cho tất cả các thể hiện của class đó. Trong bài viết này chúng ta sẽ cùng tìm hiểu về sự khác nhau giữa chúng.
Constant
Trường constant hay biến constant phải được gán giá trị lúc khai báo sau đó thì chúng không thể thay đổi giá trị. Mặc định constant là static nên không thể khai báo thêm từ khóa static cho biến constant.
public const int X = 10;
Một biến constant là một hằng số từ khi biên dịch (complie-time constant). Một biến constant có thể được khởi tạo bởi một biểu thức nhưng phải đảm bảo các toán hạng trong biểu thức cũng phải là constant.
void Calculate(int Z)
{
const int X = 10, X1 = 50;
const int Y = X + X1; //no error, since its evaluated a compile time
const int Y1 = X + Z; //gives error, since its evaluated at run time
}
Bạn có thể áp dụng từ khóa const vào các kiểu nguyên thủy (byte, short, int, long, char, float, double, decimal, bool), enum, một chuỗi, hoặc một kiểu tham chiếu và có thể gán với giá trị null.
const MyClass obj1 = null;//không có lỗi
const MyClass obj2 = new MyClass();//lỗi ở lúc runtime
Biến constant có thể được gán tất cả các access modifiers như public, private, protected, internal. Bạn sử dụng biến constant trong trường hợp chắc chắn giá trị của chúng không thay đổi.
ReadOnly
Một biến Readonly có thể được khởi tạo vào thời điểm khai báo hoặc trong constructor của class đó. Vì vậy các biến readonly có thể được sử dụng như là các hằng số lúc thực thi (run-time constants)
class MyClass
{
readonly int X = 10; // Khởi tạo lúc khai báo
readonly int X1;
public MyClass(int x1)
{
X1 = x1; // khởi tạo lúc chạy
}
}
Readonly có thể được áp dụng cho cả tham giá trị và kiểu tham chiếu trừ delegate và event. Sử dụng readonly khi bạn muốn tạo ra biến constant ở lúc runtime.
Static
Từ khóa static được sử dụng để tạo một biến hoặc một thành phần tĩnh, nghĩa là giá trị của nó sẽ được chia sẻ cho toàn bộ các đối tượng và không gắn vào một đối tượng cụ thể nào. Từ khóa static có thể được áp dụng cho cả class, fields, properties, operators, events, constructor nhưng không dùng được cho index, destructors, hay kiểu nào hơn các classs.
class MyClass
{
static int X = 10;
int Y = 20;
public static void Show()
{
Console.WriteLine(X);
Console.WriteLine(Y); //lỗi bởi vì static method chỉ truy cập được biến static
}
}
Kiến thức về từ khóa static
- Nếu từ khóa static được áp dụng cho 1 class tất cả các thành phần trong class cũng phải static
- Phương thức static chỉ có thể truy cập các thành phần static khác trong class. Các static properties được sử dụng để set và get giá trị cho các giá trị của biến static trong class.
Static constructor không thể có tham số. Không thể áp dụng các access modifiers cho static constructor, luôn có một default constructor public để khởi tạo các biến static cho clas
Trích nguồn từ: (http://www.dotnet-tricks.com/)