Giới thiệu
Mảng là một tập hợp có thứ tự của những đối tượng, tất cả các đối tượng này cùng một kiểu. Mảng trong ngôn ngữ C# có một vài sự khác biệt so với mảng trong ngôn ngữ C++ và một số ngôn ngữ khác, bởi vì chúng là những đối tượng. Do đó, trong mảng sẽ có các phương thức và thuộc tính.
Ngôn ngữ C# cung cấp cú pháp chuẩn cho việc khai báo đối tượng Array. Tuy nhiên, đối tượng thật sự được tạo ra sẽ có kiểu System.Array. Mảng trong ngôn ngữ C# kết hợp cú pháp khai báo mảng theo kiểu ngôn ngữ C truyền thống và kết hợp với khai báo đối tượng của lớp do đó biến mảng có thể truy cập những phương thức và thuộc tính của System.Array.
Một số các thuộc tính và phương thức của lớp System.Array:
Thành viên | Mô tả |
---|---|
BinarySearch() | Phương thức static tìm kiếm trên mảng một chiều đã sắp thứ tự. |
Clear() | Phương thức static thiết lập các phần tử của mảng về 0 hay null. |
Copy() | Phương thức static đã nạp chồng (overload) thực hiện sao chép một vùng của mảng vào mảng khác. |
CreateInstance() | Phương thức static đã nạp chồng (overload) tạo một thể hiện (instance) mới cho mảng |
IndexOf() | Phương thức static trả về vị trí đầu tiên của phần tử trong mảng một chiều |
LastIndexOf() | Phương thức static trả về vị trí cuối cùng của phần tử trong mảng một chiều |
Reverse() | Phương thức static đảo thứ tự của các phần tử trong mảng một chiều |
Sort() | Phương thức static sắp xếp thứ tự các phần từ trong mảng một chiều |
IsFixedSize | Thuộc tính kiểu bool cho biết mảng có kích thước cố định hay thay đổi |
IsReadOnly | Thuộc tính kiểu bool cho biết mảng chỉ cho phép đọc hay đọc/ghi |
IsSynchronized | Thuộc tính kiểu bool cho biết mảng có hổ trợ an toàn thread (thread-safe) |
Length | Thuộc tính cho biết mảng có bao nhiêu phần tử |
Rank | Thuộc tính cho biết số chiều của mảng |
SyncRoot | Thuộc tính chứa đối tượng dùng để đồng bộ truy cập trong mảng |
GetEnumerator() | Phương thức thành viên trả về đối tượng IEnumerator dùng để duyệt các phần tử của mảng |
GetLength() | Phương thức thành viên trả về kích thước của một chiều trong mảng |
GetLowerBound() | Phương thức thành viên trả về cận dưới của một chiều trong mảng |
GetUpperBound() | Phương thức thành viên trả về cận trên của một chiều trong mảng |
Initialize() | Khởi tạo các phần tử trong mảng bằng cách gọi default contructor cho từng phần tử |
SetValue() | Phương thức thành viên thiết lập giá trị cho một phần tử xác định trong mảng |
Khai báo mảng
Cú pháp khai báo mảng trong C#:
Kiểu_dữ_liệu[] tên_mảng;
Cặp đấu ngoặc vuông ([]) báo cho trình biên dịch biết rằng chúng ta đang khai báo một mảng. Kiểu dữ liệu sẽ là kiểu của các phần tử trong mảng.
Ví dụ:
int[] arrayInt;
Để tạo ra thể hiện của mảng trên bộ nhớ, chúng ta dùng toán tử new như sau:
arrayInt = new int[10];
Khai báo này sẽ thiết lập trên bộ nhớ một mảng có 10 phần tử số nguyên.
Vấn đề quan trọng ở đây là cần phải phân biệt được mảng và các phần tử của mảng. Đối tượng arrayInt là một mảng, các phần tử là 10 số nguyên được lưu trữ trong mảng.
Trong C#, mảng thuộc kiểu tham chiếu, được tạo ra trên heap. Do đó, trong ví dụ trên, arrayInt được cấp phát trên heap.
Giá trị mặc định
Khi chúng ta tạo ra một mảng có kiểu giá trị, mỗi phần tử sẽ chứa giá trị mặc định của kiểu. Với khai báo:
arrayInt = new int[10];
sẽ tạo ra một mảng có 10 số nguyên, mỗi phần tử sẽ có giá trị mặc định là 0.
Nếu các phần tử của mảng có kiểu là tham chiếu, các phần tử này sẽ không được khởi tạo giá trị mặc định, mà sẽ được khởi tạo giá trị là null. Nếu chúng ta cố gắng truy xuất các phần tử kiểu tham chiếu của mảng mà chưa được khởi tạo, một biệt lệ (exception) sẽ được tạo và đẩy về cho chúng ta.
Truy cập các phần tử trong mảng
Để truy cập vào phần tử trong mảng ta có thể sử dụng toán tử chỉ mục ([]). Vị trí phần tử bắt đầu của mảng là 0, do đó chỉ số của phần tử đầu tiên của mảng luôn luôn là 0. Như ví dụ trên thành phần đầu tiên là myArray[0].
Như đã trình bày ở trên, mảng là đối tượng, và do đó nó có các thuộc tính. Một trong những thuộc tính hay sử dụng là Length, thuộc tính này sẽ báo cho biết số phần tử trong một mảng. Một mảng có thể được đánh chỉ số từ 0 đến Length –1. Do đó nếu có 10 phần tử trong mảng thì các chỉ số sẽ là:0, 1, 2, …, 9.
Ví dụ dưới đây minh họa sử dụng mảng
using System; namespace UseArray { class Student { int stuId; string name; public Student() { stuId = 0; name = ""; } public Student(int stuId, string name) { this.stuId = stuId; this.name = name; } public override string ToString() { return "[ " + stuId + " - " + name + " ]"; } public void Input() { Console.Write("Input Student Id: "); stuId = Convert.ToInt32(Console.ReadLine()); Console.Write("Input Student Name: "); name = Console.ReadLine(); } } class Program { static void Main(string[] args) { int totalStudent = 0; // Yêu cầu người dùng nhập số Student Console.Write("Input total Students: "); totalStudent = Convert.ToInt32(Console.ReadLine()); // Khai báo và khởi tạo mảng Student Student[] list = new Student[totalStudent]; // duyệt qua các phần tử của mảng, khởi tạo // từng phần tử và gọi hàm Input() để nhập dữ liệu for (int i = 0; i < list.Length; i++) { list[i] = new Student(); list[i].Input(); } // in mảng Student đã nhập ra màn hình for (int i = 0; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.ReadKey(); // ngừng màn hình để quan sát } } }
Khởi tạo các phần tử của mảng
Chúng ta có thể khởi tạo các phần tử của một mảng ngay lúc khai báo mảng bằng cách đặt những giá trị bên trong dấu ngoặc ({}). C# cung cấp hai cú pháp để khởi tạo các thành phần của mảng, một cú pháp dài và một cú pháp ngắn:
int[] arrayInt = new int[5] { 2, 4, 6, 8, 10 };
Và:
int[] arrayInt = { 2, 4, 6, 8, 10 };
Không có sự khác biệt giữa hai cú pháp trên, và hầu hết các chương trình đều sử dụng cú pháp ngắn hơn do sự tự nhiên và lười đánh nhiều lệnh của người lập trình.