Trong bài biến trong C#, chúng ta đã biết cách khai báo biến, khi khai báo biến thì phải khai báo kiểu dữ liệu cho biến đó. Trong bài này, chúng ta sẽ cùng tìm hiểu về kiểu dữ liệu trong C#
1. Định nghĩa
Kiểu dữ liệu là tập hợp các nhóm dữ liệu có cùng đặc tính, cách lưu trữ và thao tác xử lý trên trường dữ liệu đó.
Khai báo kiểu dữ liệu để trình biên dịch nhận biết kích thước và khả năng của một biến.
2. Phân loại kiểu dữ liệu
Theo cách hiểu của người dùng thì có 2 loại kiểu dữ liệu là:
- Kiểu dữ liệu có sẵn do ngôn ngữ lập trình cung cấp
- Kiểu dữ liệu do người dùng tự định nghĩa
Theo cách hiểu của người dùng thì có 2 loại kiểu dữ liệu là:
- Kiểu dữ liệu có sẵn do ngôn ngữ lập trình cung cấp
- Kiểu dữ liệu do người dùng tự định nghĩa
Còn trong C#, các biến được phân chia thành 3 kiểu dữ liệu sau:
- Kiểu giá trị (Value)
- Kiểu tham chiếu (Reference)
- Kiểu con trỏ (Pointer)
- Kiểu giá trị (Value)
- Kiểu tham chiếu (Reference)
- Kiểu con trỏ (Pointer)
2.1: Kiểu giá trị
Các biến thuộc kiểu này có thể được gán giá trị một cách trực tiếp, đây là kiểu dữ liệu được ngôn ngữ cung cấp. Nó kế thừa từ class System.ValueType.
Một biến khi được khai báo là kiểu giá trị thì hệ thống sẽ cấp phát bộ nhớ, vùng nhớ của biến đó sẽ chứa giá trị của dữ liệu và được lưu trữ trong bộ nhớ Stack.
Bảng liệt kê danh sách các kiểu dữ liệu có sẵn trong C#:
Kiểu số nguyên
Kiểu ký tự
Kiểu logic
Kiểu số thực
- Từ khóa sizeof
Trong trường hợp bạn quên giá trị của từng loại kiểu dữ liệu, bạn có thể sử dụng biểu thức sizeof(type) để lấy kích cở chính xác của một biểu thức hoặc một biến nào đó. Giá trị trả về của sizeof() là kích cỡ của đối tượng hoặc kiểu bằng giá trị byte.
Ví dụ:
Một biến khi được khai báo là kiểu giá trị thì hệ thống sẽ cấp phát bộ nhớ, vùng nhớ của biến đó sẽ chứa giá trị của dữ liệu và được lưu trữ trong bộ nhớ Stack.
Bảng liệt kê danh sách các kiểu dữ liệu có sẵn trong C#:
Kiểu số nguyên
Kiểu dữ liệu | Kích thước (bytes) | Mô tả |
byte | 1 | Số nguyên dương có giá trị từ 0 đến 255 |
sbyte | 1 | Số nguyên từ -128 đến 127 |
short | 2 | Số nguyên có giá trị từ -32,768 đến 32,767 |
ushort | 2 | Số nguyên có giá trị từ 0 đến 65,535 |
int | 4 | Số nguyên có giá trị từ -2,147,483,647 đến 2,147,483,647 |
uint | 4 | Số nguyên có giá trị từ 0 đến 4,294,967,295 |
long | 8 | Số nguyên có giá trị từ -9,223,370,036,854,775,808 đến 9,223,370,036,854,775,807 |
ulong | 8 | Số nguyên có giá trị từ 0 đến 18,446,744,073,709,551,615 |
Kiểu dữ liệu | Kích thước (bytes) | Mô tả |
char | 2 | Chứa một ký tự Unicode |
Kiểu dữ liệu | Kích thước (bytes) | Mô tả |
bool | 1 | Chứa 1 trong 2 giá trị là True hoặc False |
Kiểu dữ liệu | Kích thước (bytes) | Mô tả |
float | 4 | Kiểu số thực dấu chấm động có giá trị dao động từ 3.4E – 38 đến 3.4E + 38, với 7 chữ số có nghĩa |
double | 8 | Kiểu số thực dấu chấm động có giá trị dao động từ 1.7E – 308 đến 1.7E + 308, với 15, 16 chữ số có nghĩa |
decimal | 8 | Có độ chính xác đến 28 con số và giá trị thập phân, được dùng trong tính toán tài chính |
Trong trường hợp bạn quên giá trị của từng loại kiểu dữ liệu, bạn có thể sử dụng biểu thức sizeof(type) để lấy kích cở chính xác của một biểu thức hoặc một biến nào đó. Giá trị trả về của sizeof() là kích cỡ của đối tượng hoặc kiểu bằng giá trị byte.
Ví dụ:
Console.WriteLine("quantrimaytinh.com"); Console.WriteLine("vi du ve tu khoa sizeof"); Console.WriteLine("Kich co kieu int la: {0}", sizeof(int)); Console.WriteLine("Kich co kieu float la: {0}", sizeof(float)); Console.WriteLine("Kich co kieu double la: {0}", sizeof(double)); Console.WriteLine("Kich co kieu char la: {0}", sizeof(char)); Console.ReadKey();
2.2: Kiểu tham chiếu
Một biến khi được khai báo là kiểu tham chiếu thì tại vùng nhớ của biến đó chỉ chứa địa chỉ ô nhớ và được lưu trong bộ nhớ Stack, dữ liệu thực sự của biến được lưu trong bộ nhớ Heap.Ta có một số kiểu dữ liệu thuộc kiểu tham chiếu có sẵn trong C# như: object, dynamic, string... Và tất cả các kiểu dữ liệu do người dùng định nghĩa đều là kiểu dữ liệu tham chiếu.
Sơ đồ minh họa cách lưu trữ của 2 kiểu dữ liệu
- Biến a được lưu thẳng giá trị là 6 vào bộ nhớ Stack.
- Biến b được lưu giá trị là "quantrimaytinh" vào bộ nhớ Heap, tại bộ nhớ Stack thì chỉ lưu địa chỉ ô nhớ của biến b trong bộ nhớ Heap là 0x10101.
- Biến b được lưu giá trị là "quantrimaytinh" vào bộ nhớ Heap, tại bộ nhớ Stack thì chỉ lưu địa chỉ ô nhớ của biến b trong bộ nhớ Heap là 0x10101.
- Bộ nhớ Stack và bộ nhớ Heap đều là bộ nhớ trên RAM nhưng cách tổ chức, quản lý dữ liệu cũng như sử dụng thì rất khác nhau.
Kiểu object
Đây là kiểu dữ liệu cơ bản nhất của tất cả các kiểu dữ liệu trong .NET. Mọi kiểu dữ liệu đều được kế thừa từ System.Object nên kiểu object có thể gán mọi giá trị của các kiểu dữ liệu khác như kiểu tham chiếu, kiểu giá trị hoặc kiểu do người dùng tự định nghĩa,... Tuy nhiên trước khi gán giá trị nó cần được chuyển kiểu.
Kiểu dynamic
Đây là một kiểu dữ liệu mới được đưa vào trong C# thời đại 4.0. Ta có lưu mọi kiểu giá trị trong biến kiểu dynamic. Đối tượng thuộc kiểu này sẽ không xác định được kiểu dữ liệu cho đến khi chương trình được thực thi.
Ta khai báo kiểu dynamic như khai báo biến bình thường:
dynamic <tên biến>; hoặc dynamic <tên biến> = <giá trị>;
Kiểu string
Đây là một kiểu dữ liệu cho phép gán chuỗi vào biến, nó được kế thừa từ kiểu object.
Kiểu object
Đây là kiểu dữ liệu cơ bản nhất của tất cả các kiểu dữ liệu trong .NET. Mọi kiểu dữ liệu đều được kế thừa từ System.Object nên kiểu object có thể gán mọi giá trị của các kiểu dữ liệu khác như kiểu tham chiếu, kiểu giá trị hoặc kiểu do người dùng tự định nghĩa,... Tuy nhiên trước khi gán giá trị nó cần được chuyển kiểu.
Kiểu dynamic
Đây là một kiểu dữ liệu mới được đưa vào trong C# thời đại 4.0. Ta có lưu mọi kiểu giá trị trong biến kiểu dynamic. Đối tượng thuộc kiểu này sẽ không xác định được kiểu dữ liệu cho đến khi chương trình được thực thi.
Ta khai báo kiểu dynamic như khai báo biến bình thường:
dynamic <tên biến>; hoặc dynamic <tên biến> = <giá trị>;
Kiểu string
Đây là một kiểu dữ liệu cho phép gán chuỗi vào biến, nó được kế thừa từ kiểu object.
Ngoài ra còn có các kiểu dữ liệu tham chiếu do người dùng tự định nghĩa như class, interface, delegate.
2.3: Kiểu con trỏ
Biến kiểu con trỏ lưu địa chỉ bộ nhớ của kiểu khác. Con trỏ trong C# có cùng khả năng như con trỏ trong C hoặc C++. Cú pháp để khai báo biến kiểu con trỏ là: type*identifier;
Ví dụ:
char*abc;
int*xyz;
- Giá trị của kiểu char sẽ nằm trong dấu ' ' (nháy đơn).
- Giá trị của kiểu string sẽ nằm trong dấu " " (nháy kép).
- Giá trị của biến kiểu float phải có chữ F hoặc f làm hậu tố. Ví dụ: float BienFloat = 6.9f;
- Giá trị của biến kiểu decimal phải có chữ m hoặc M làm hậu tố.
- Trừ kiểu string, tất cả kiểu dữ liệu trên đều không được có giá trị null.
- Null là giá trị rỗng, không tham chiếu đến vùng nhớ nào.
- Để có thể gán giá trị null cho biến thì ta thêm ký tự ? vào sau tên kiểu dữ liệu là được. Ví dụ: int?
Ví dụ:
char*abc;
int*xyz;
3. MỘT SỐ LƯU Ý KHI SỬ DỤNG KIỂU DỮ LIỆU
- Kiểu dữ liệu có miền giá trị lớn hơn sẽ chứa được kiểu dữ liệu có miền giá trị nhỏ hơn. Nên biến kiểu dữ liệu nhỏ hơn có thể gán giá trị qua biến kiểu dữ liệu lớn hơn.- Giá trị của kiểu char sẽ nằm trong dấu ' ' (nháy đơn).
- Giá trị của kiểu string sẽ nằm trong dấu " " (nháy kép).
- Giá trị của biến kiểu float phải có chữ F hoặc f làm hậu tố. Ví dụ: float BienFloat = 6.9f;
- Giá trị của biến kiểu decimal phải có chữ m hoặc M làm hậu tố.
- Trừ kiểu string, tất cả kiểu dữ liệu trên đều không được có giá trị null.
- Null là giá trị rỗng, không tham chiếu đến vùng nhớ nào.
- Để có thể gán giá trị null cho biến thì ta thêm ký tự ? vào sau tên kiểu dữ liệu là được. Ví dụ: int?
4. MỘT SỐ LỖI THƯỜNG GẶP KHI MỚI HỌC
- Không gán giá trị cho biến (trừ kiểu string)
Ví dụ: int a;
- Gán giá trị nằm ngoài kiểu dữ liệu của biến.
Ví dụ: int b = 6.9;
- Dùng dấu nháy đơn cho kiểu string.
Ví dụ: string d = 'Q';
Vẫn phải sử dụng dấu nháy kép mặc dù giá trị gán chỉ có 1 ký tự.
- Gán giá trị null cho biến không phải kiểu string.
Ví dụ: long x = null;
Ta có thể sửa thành long? x = null;
- Gán giá trị của biến có kiểu dữ liệu lớn hơn cho biến có kiểu dữ liệu nhỏ hơn.
Ví dụ: int x = 10;
byte y = x;
Mặc dù 10 vẫn nằm trong khoảng giá trị của kiểu byte nhưng vẫn không thể gán giá trị biến kiểu int cho biến kiểu byte được.
Ví dụ: int a;
- Gán giá trị nằm ngoài kiểu dữ liệu của biến.
Ví dụ: int b = 6.9;
- Dùng dấu nháy đơn cho kiểu string.
Ví dụ: string d = 'Q';
Vẫn phải sử dụng dấu nháy kép mặc dù giá trị gán chỉ có 1 ký tự.
- Gán giá trị null cho biến không phải kiểu string.
Ví dụ: long x = null;
Ta có thể sửa thành long? x = null;
- Gán giá trị của biến có kiểu dữ liệu lớn hơn cho biến có kiểu dữ liệu nhỏ hơn.
Ví dụ: int x = 10;
byte y = x;
Mặc dù 10 vẫn nằm trong khoảng giá trị của kiểu byte nhưng vẫn không thể gán giá trị biến kiểu int cho biến kiểu byte được.
Bài viết liên quan
Hàm đệ quy trong C#
enum trong C#
Struct trong C#
Lớp String trong C#
Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C#