Trang chủ C# cơ bản Kiểu dữ liệu trong C#

Kiểu dữ liệu trong C#

Nguyễn Dương 07-06-2024

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

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)


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 dữ liệu
Kích thước
(bytes)
Mô tả
byte
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 ký tự
Kiểu dữ liệu
Kích thước
(bytes)
Mô tả
char
2Chứa một ký tự Unicode
Kiểu logic
Kiểu dữ liệu
Kích thước
(bytes)
Mô tả
bool
1Chứa 1 trong 2 giá trị là True hoặc False 
Kiểu số thực
Kiểu dữ liệu
Kích thước
(bytes)
Mô tả
float
4Kiể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
8Kiể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
8Có độ 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
- 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ụ:
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
Kiểu dữ liệu trong C#
Lưu ý: Đây chỉ là sơ đồ mang tính minh họa
- Biến a được lưu thẳng giá trị là 6 vào bộ nhớ Stack.
- Biến đượ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 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.
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;

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ữ 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. 

Bài viết liên quan

Hàm đệ quy trong C# Hàm đệ quy trong C#
enum trong C# enum trong C#
Struct trong C# Struct trong C#
Lớp String trong C# Lớp String trong C#
Vòng lặp foreach trong C# Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C# Mảng đa chiều, mảng của mảng trong C#