Ngôn Ngữ Lập Trình C#
Hai câu lệnh tiếp theo cộng một giá trị nguyên vào phân số f3 và gán kết quả mới về cho phân
số mới f4:
Fraction f4 = f3 + 5;
Console.WriteLine(“f3 + 5 = f4: {0}”, f4.ToString());
Kết quả được trình bày theo thứ tự sau:
In implicit conversion to Fraction
In Fraction Construction(int)
In operator+
In Fraction Constructor(int, int)
f3 + 5 = f4: 25/4
Ghi chú: rằng toán tử chuyển đổi ngầm định được gọi khi chuyển 5 thành một phân số.
Phân số được tạo ra từ toán tử chuyển đổi ngầm định này gọi phương thức khởi dựng một
tham số để tạo phân số mới 5/1. Phân số mới này sẽ được chuyển thành toán hạng trong phép
cộng với phân số f3 và kết quả trả về là phân số f4 là tổng của hai phân số trên.
Thử nghiệm cuối cùng là tạo một phân số mới f5, rồi sau đó gọi toán tử nạp chồng so sánh
bằng để kiểm tra xem hai phân số có bằng nhau hay không.
Câu hỏi và trả lời
Câu hỏi 1: Có phải khi xây dựng các lớp chúng ta chỉ cần dùng nạp chồng toán tử với các
chức năng tính toán ?
Trả lời 1: Đúng là như vậy, việc thực hiện nạp chồng toán tử rất tự nhiên và trực quan. Tuy
nhiên một số ngôn ngữ .NET như VB.NET không hỗ trợ việc nạp chồng toán tử nên, tốt nhất
nếu muốn cho lớp trong C# của chúng ta có thể được gọi từ ngôn ngữ khác không hỗ trợ nạp
chồng toán tử thì nên xây dựng các phương thức tương đương để thực hiện cùng chức năng
như: Add, Sub, Mul,
Câu hỏi 2: Những điều lưu ý nào khi sử dụng nạp chồng toán tử trong một lớp?
Trả lời 2: Nói chung là khi nào thật cần thiết và ít gây ra sự nhầm lẫn. Ví dụ như ta xây dựng
lớp Employee có nhiều thuộc tính số như lương, thâm niên, tuổi Chúng ta muốn xây dựng
toán tử ++ cho lương nhưng có thể làm nhầm lẫn với việc tăng số năm công tác, hay tăng
tuổi. Do vậy việc sử dụng nạp chồng toán tử cũng phải cân nhắc tránh gây nhầm lẫn. Tốt
nhất là sử dụng trong lớp có ít thuộc tính số
Định nghĩa một cấu trúc
Tạo cấu trúc
Cấu trúc là một kiểu giá trị
Gọi bộ khởi dựng mặc định
Tạo cấu trúc không gọi new
Câu hỏi & bài tập
Cấu trúc là kiểu dữ liệu đơn giản do người dùng định nghĩa, kích thước nhỏ dùng để thay thế
cho lớp. Những cấu trúc thì tương tự như lớp cũng chứa các phương thức, những thuộc tính,
các trường, các toán tử, các kiểu dữ liệu lồng bên trong và bộ chỉ mục (indexer).
Có một số sự khác nhau quan trọng giữa những lớp và cấu trúc. Ví dụ, cấu trúc thì không hỗ
trợ kế thừa và bộ hủy giống như kiểu lớp. Một điều quan trọng nhất là trong khi lớp là kiểu
dữ liệu tham chiếu, thì cấu trúc là kiểu dữ lịêu giá trị (Chương 3 đã thảo luận về kiểu dữ liệu
tham chiếu và kiểu dữ liệu giá trị). Do đó cấu trúc thường dùng để thể hiển các đối tượng
không đòi hỏi một ngữ nghĩa tham chiếu, hay một lớp nhỏ mà khi đặt vào trong stack thì có
lợi hơn là đặt trong bộ nhớ heap.
Một sự nhận xét được rút ra là chúng ta chỉ nên sử dụng những cấu trúc chỉ với những kiểu
dữ liệu nhỏ, và những hành vi hay thuộc tính của nó giống như các kiểu dữ liệu được xây
dựng sẵn.
Cấu trúc có hiệu quả khi chúng ta sử dụng chúng trong mảng bộ nhớ (Chương 9). Tuy nhiên,
cấu trúc sẽ kém hiệu quả khi chúng ta sử dụng dạng tập hợp (collections). Tập hợp được xây
dựng hướng tới các kiểu dữ liệu tham chiếu.
Trong chương này chúng ta sẽ tìm hiểu các định nghĩa và làm việc với kiểu cấu trúc và cách
sử dụng bộ khởi dựng để khởi tạo những giá trị của cấu trúc.
Định nghĩa một cấu trúc
Cú pháp để khai báo một cấu trúc cũng tương tự như cách khai báo một lớp:
[thuộc tính] [bổ sung truy cập] struct <tên cấu trúc> [: danh sách giao diện]
{
[thành viên của cấu trúc]
Cấu Trúc
165
public int y
{
get
{
return yVal;
}
set
{
yVal = value;
}
}
Cấu Trúc
166
.
.
Ngôn Ngữ Lập Trình C#
public override string ToString()
{
return (String.Format(“{0}, {1}”, xVal, yVal));
}
// thuộc tính private lưu toạ độ x, y
private int xVal;
private int yVal;
}
public class Tester
{
public void myFunc( Location loc)
{
loc.x = 50;
loc.y = 100;