Bài 3. Biến, hằng và kiểu dữ liệu

Biến

Biến là đơn vị được các ngôn ngữ lập trình tổ chức để lưu trữ và xử lý dữ liệu. Giá trị của biến có thể được thay đổi trong chương trình tùy theo nhu cầu sử dụng.

Khai báo 

Cú pháp:

[modifier] datatype identifier;

  • [modifier] là một trong những từ khóa public, private, protected, …;
  • datatype là kiểu dữ liệu;
  • identifier là biến được người dùng định nghĩa;

Ví dụ: một biến tên i kiểu số nguyên int và có thể được truy cập bởi bất cứ hàm nào.
   public int i;

Ta cũng có thể khai báo biến và khởi tạo cho biến một giá trị như sau:
   int i = 10;

Nếu ta khai báo nhiều biến có cùng kiểu dữ liệu sẽ có dạng như sau:
   int x = 10, y = 20;


Phạm vi hoạt động của biến

Trong C#, phạm vi hoạt động của biến là vùng đoạn mã mà từ đấy biến có thể được truy xuất. Thông thường một đoạn mã được định nghĩa bằng một cặp dấu {}. Trong một phạm vi hoạt động (scope), không thể có hai biến cùng mang một tên trùng nhau.

Ví dụ sau thực hiện việc in ra các số từ 0 đến 9 ra màn hình rồi tiếp tục in các số từ 9 đến 0 ra màn hình;

public static int Main() {
for (int i = 0; i < 10; i++) {
    Console.WriteLine(i);
} // biến i ra khỏi phạm vi
// Chúng ta có thể khai báo thêm biến i ở đây
for (int i = 9; i >= 0; i--) {
    Console.WriteLine(i);
} // biến i ra khỏi phạm vi ở đây

return 0;
}

Với ví dụ trên, trong 2 vòng lặp for khác nhau, ta có thể khai báo cùng một biến i cho dù 2 vòng lặp này cùng nằm trong một khối lệnh. Điều này hợp lý bởi vì i được khai báo trong hai vòng lặp khác nhau và là biến cục bộ của 2 vòng lặp đó. Khi vòng lặp hoàn được thực hiện xong thì biến tự động được giải phóng và vì thế các biến ở các vòng lặp khác nhau thì có thể được đặt tên giống nhau.


Hằng

Một hằng (constant) là một biến nhưng giá trị không thể thay đổi được suốt thời gian thi hành chương trình.

Khai báo:

const datatype identifier = value;

Ví dụ:

const float soPI = 3.14;

Hằng có những đặc điểm sau:
- Hằng bắt buộc phải được gán giá trị lúc khai báo. Một khi đã được khởi gán thì không thể viết đè lên
- Trị của hằng phải có thể được tính toán vào lúc biên dịch, do đó không thể gán một hằng từ một trị của một biến.
- Hằng bao giờ cũng static, tuy nhiên ta không thể đưa từ khoá static vào khi khai báo hằng Có ba thuận lợi khi sử dụng hằng trong chương trình của bạn:
- Hằng làm cho chương trình đọc dễ dàng hơn, bằng cách thay thế những con số vô cảm bởi những tên mang đầy ý nghĩa hơn
- Hằng làm cho dễ sửa chương trình hơn, việc thay đổi giá trị chỉ cần thực hiện một lần ngay tại vị trí khai báo hàm
- Hằng làm cho việc tránh lỗi dễ dàng hơn, nếu bạn gán một trị khác cho một hằng vốn đã được khai báo đâu đó trong chương trình trình biên dịch sẽ tự động thông báo lỗi vì hằng này đã được khai báo


Kiểu dữ liệu

C# là một ngôn ngữ được kiểm soát chặt chẽ về mặt kiểu dữ liệu, ngoài ra C# còn chia các kiểu dữ liệu thành hai loại khác nhau: kiểu trị (value type) và kiểu qui chiếu (reference type). Nghĩa là trên một chương trình C# dữ liệu được lưu trữ một hoặc hai nơi tuỳ theo đặc thù của kiểu dữ liệu. C# cũng hỗ trợ kiểu con trỏ (pointer type) giống như C++ nhưng ít khi dùng đến và chỉ dùng khi làm việc với đoạn mã unmanaged. Đoạn mã unmanaged là đoạn mã đuợc tạo ra ngoài .NET Framework, chẳng hạn những đối tượng COM.


Kiểu giá trị (Value Types)

Kiểu dữ liệu số nguyên

3-1

Với các kiểu dữ liệu trên, ta có thể khai báo biến như sau:

long x = 0x12ab; // ghi theo hexa
int i = 1234;

Khi sử dụng các kiểu số nguyên của C# cần chú ý rằng kiểu int của C# được cấp phát 32bit không giống như kiểu int của Ansi C vốn chỉ được cấp phát 16bit. Nói một cách khác kiểu int trong C# tương ứng với kiểu long trong Ansi C.


Kiểu dữ liệu dấu chấm động

3-2


Các kiểu dữ liệu khác

3-3


Kiểu tham chiếu (Reference Type)

C# hỗ trợ 2 kiểu tham chiếu cớ bản: object, string. Kiểu object là kiểu dữ liệu dữ liệu gốc, tất cả các kiểu dữ liệu khác đều được dẫn xuất từ kiểu dữ liệu này. Kiểu string là kiểu dữ liệu trình bày chuỗi ký tự. Chuỗi string trong C# hỗ trợ hoàn toàn unicode.

Cũng giống như Ansi C và Java, C# định nghĩa giá trị của một chuỗi trong cặp dấu ngoặc kép "", còn được gọi là Double Quote. Để tiện cho việc xử lý tất cả các ký tự, C# định nghĩa một số ký tự đặc biệt gọi là Escape Sequence.

Danh sách các Escape Sequence thông dụng.

3-4

C# hỗ trợ toán tử + để ghép nối các chuỗi và toán tử = để gán giá trị cho chuỗi. Ví dụ sau trình bày các toán tử dùng cho kiểu string.

public static int Main() {
    string s1 = "Windows folder is: ";
    string s2 = "C:\\windows";
    Console.WriteLine("s1 is: " + s1);
    Console.WriteLine("s2 is: " + s2);
    s1 = s1 + s2;
    Console.WriteLine("s1 is now: " + s1);
    Console.WriteLine("s2 is now: " + s2);

return 0;
}

Chương trình chạy ra kết quả như sau:

s1 is: Windows folder is
s2 is: C:\windows
s1 is now: Windows folder is C:\windows
s2 is now: C:\windows

Ví dụ trên cho thấy sau khi thực hiện toán tử gán thì giá trị của biểu thức bên phải sẽ được gán vào biến bên trái cho dù biểu thức ở phía bên phải có sự xuất hiện của biến được trả về. Cũng trong ví dụ này, để mô tả ký tự \ (ký tự đường dẫn hay ký tự Backslash), chúng ta phải sử dụng quy định của Escape Sequence, trong trường hợp này, ví dụ sử dụng ký tự \\.