CodeGym /Các khóa học /C# SELF /Hằng số và từ khóa var

Hằng số và từ khóa var

C# SELF
Mức độ , Bài học
Có sẵn

1. Hằng số

Hằng số — là biến "ma thuật" mà giá trị của nó không thể (và cũng không nên!) thay đổi sau khi khai báo. Hãy tưởng tượng bạn dán một cái sticker siêu dính lên cốc của mình ghi "Chỉ trà thôi". Khi đã dán sticker này rồi thì bạn không thể đổi trà sang cà phê nữa (ít nhất là trong C#).


const int DaysInWeek = 7;
const string HelloMessage = "Chào mừng!";
Khai báo hằng số

Trong mấy ví dụ này DaysInWeek sẽ luôn là 7, còn HelloMessage — luôn là lời chào. Khi giá trị hằng số đã được xác định thì không thể đổi nữa.

Tại sao cần hằng số?

  • Code rõ ràng: khi bạn thấy const double Pi = 3.14159;, không ai nghi ngờ đây là hằng số, không phải biến mà ai đó có thể sửa giữa chương trình.
  • An toàn: không ai (kể cả chính bạn sau vài tháng) có thể vô tình ghi đè giá trị hằng số.
  • Hiệu năng: compiler C# sẽ chèn giá trị hằng số trực tiếp vào chỗ gọi, nên chương trình chạy nhanh hơn chút.

Cú pháp khai báo


const kiểu tên = giá trị;
Cú pháp khai báo hằng số
  • Kiểu — bất kỳ kiểu nguyên thủy nào (int, double, string, char, cũng như enum và literal).
  • Tên — thường dùng kiểu CamelCase hoặc PascalCase. Với "hằng số ma thuật" đôi khi dùng toàn chữ hoa và gạch dưới (DAYS_IN_WEEK), nhưng trong C# thì không bắt buộc.

Ví dụ:

const double GRAVITY = 9.81; // gia tốc rơi tự do, m/s^2
const char DELIMITER = ',';
const string DEVELOPER_NAME = "Ivan Petrov";

Đặc điểm và giới hạn của hằng số

  • Giá trị phải biết tại thời điểm biên dịch. Nghĩa là không thể khai báo hằng số mà giá trị của nó được tính trong lúc chạy chương trình.
const int NowYear = DateTime.Now.Year; // LỖI BIÊN DỊCH!
  • Chỉ dùng được kiểu đơn giản, string hoặc enum.
  • Không thể làm hằng số cho mảng, object, kết quả gọi hàm, v.v.
  • Ngay cả biểu thức toán học tưởng "đơn giản" cũng phải được compiler tính, không phải lúc chạy chương trình.

Ví dụ này là không được:

const string FullGreeting = "Xin chào, " + userName; // userName là biến, không được!

Còn thế này thì được và nên làm:

const string DefaultGreeting = "Xin chào, người dùng!";

Hằng số thường khai báo ở đâu?

  • Ở đầu class (hoặc file), trên các method.
  • Trong các class chuyên chứa hằng số (ví dụ public static class Constants).
  • Ở cấp class, nếu hằng số chỉ liên quan đến class đó.

Ví dụ cho app console của mình:

class Program
{
    const string Welcome = "Chào mừng đến với ứng dụng của chúng tôi!";
    static void Main(string[] args)
    {
        Console.WriteLine(Welcome);
    }
}

Hằng số và phạm vi nhìn thấy

Hằng số tuân theo quy tắc phạm vi giống biến thường: chỉ thấy được trong phạm vi nơi nó khai báo.

2. Từ khóa var

Từ khóa var — không phải kiểu biến mới, mà là cách tiện để compiler tự xác định kiểu biến dựa vào ngữ cảnh.

Nó chỉ là cú pháp sugar thôi — không có phép màu gì đâu, sau khi biên dịch thì biến vẫn là kiểu bình thường.


var age = 23;      // compiler hiểu: age là int
var name = "Anna"; // compiler hiểu: string
var price = 99.99; // compiler hiểu: double
Dùng var để suy luận kiểu

Tại sao lại có var?

  • Dễ đọc: không cần gõ mấy kiểu dài ngoằng (kiểu như Dictionary<string, List<int>>) bằng tay.
  • Linh hoạt: dễ đổi kiểu sau này: sửa bên phải — bên trái var tự nhận.
  • Phong cách hiện đại: gần như mọi project C# hiện đại đều dùng var khi kiểu dễ đoán từ khởi tạo.

Khi nào nên (và cần) dùng var

  • Khi bên phải nhìn phát biết ngay kiểu biến là gì.
  • Khi kiểu quá rõ ràng (var price = 100; — ai cũng biết là int).
  • Khi kiểu quá dài hoặc phức tạp (ví dụ kết quả truy vấn LINQ).
var numbers = new int[] { 1, 2, 3, 4 };
var input = Console.ReadLine(); // input là string (method trả về string)

Khi nào KHÔNG nên dùng var

Nếu kiểu không rõ ràng từ bên phải, code sẽ khó hiểu hơn. Nếu sau một tháng bạn và đồng đội cũng không đoán nổi kiểu gì, thì nên ghi rõ ra.

var mystery = DoSomethingVeryComplicated(); // BẠN LÀ AI, mystery???

Ở đây nên ghi rõ kiểu:

string result = DoSomethingVeryComplicated();

Quy tắc vàng: chỉ dùng var khi nó không làm code khó đọc hơn!

var — chỉ cho biến cục bộ

Từ khóa var chỉ dùng cho biến cục bộ — trong method thôi. Không dùng var cho:

  • tham số method;
  • property của class;
  • hằng số.

var hoạt động "bên trong" như thế nào

  • Compiler C# khi biên dịch sẽ thay đúng kiểu vào.
  • Sau khi biên dịch thì không còn var nữa.
  • Không ảnh hưởng hiệu năng: chỉ là tiện cho coder thôi.
var year = 2025; // lúc biên dịch thành: int year = 2025;

Lỗi thường gặp khi dùng var

  • Biến chưa khởi tạo:
var a; // LỖI: Compiler không biết kiểu gì!
  • Khởi tạo mơ hồ:
var list = null; // LỖI: Kiểu null không xác định!
  • Dùng lại biến với kiểu khác:
var value = 5; // value là int
value = "Năm"; // LỖI: value đã là int!

So sánh: kiểu rõ ràng và var

Tình huống Kiểu rõ ràng var
Kiểu rõ ràng
int age = 42;
var age = 42;
Method trả về kiểu phức tạp
Dictionary<int, string> dict = SomeFunc();
var dict = SomeFunc();
Mảng
string[] names = ...
var names = ...
Gợi ý:

đa số trường hợp trong project hiện đại đều dùng var cho biến cục bộ. Với tham số, property, hằng số — chỉ dùng kiểu rõ ràng thôi.

3. Bẫy và lời khuyên

Trong C# người ta hay viết số ma thuật trực tiếp trong code ("7", "3.14159", "0.15" và mấy con số bí ẩn khác). Như vậy là dở: nếu giá trị thay đổi thì phải tìm hết mọi chỗ trong project. Hãy dùng hằng số! Vừa dễ cho mình, vừa không bị đồng đội nguyền rủa...

Với var thì lại ngược: nếu code toàn var mà không ai biết kiểu gì — code sẽ nhanh chóng thành khó hiểu. Vậy nên chỉ dùng var khi hợp lý và dễ đoán kiểu từ ngữ cảnh, còn lại thì cứ ghi rõ kiểu ra cho chắc.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION