Những chủ đề tiến bộ trong C#
Các ép kiểu do người dùng định
nghĩa – Phần 1
Trong các chương trước ta được học về cách chuyển đổi giá trị giữa những
kiểu dữ liệu cơ bản. chúng ta cũng đã học hai cách ép kiểu là :
- Không tường minh (Implicit)
- Tường minh (Explicit)
c# cho phép ta định nghĩa những lớp và cấu trúc riêng,do đó ta cũng
mun những cách thức mà cho phép ta chuyn đi giữa những loại d
liu của rng ta. C# cho phép làm điều đó.chế của là ta thđịnh
nghĩa một ép kiểu như một thao tác thành viên của một trong những lp
thích hợp. việc ép kiểu phải được đánh dấu là implicit hoặc explicit để chỉ
định cách mà bn muốn sdụng với nó. cũng giống như việc ép kiểu bản
: nếu bạn biết việc ép kiểu là an toàn ,dù bất cứ giá trnào đựợc giữ bởi
biến nguồn, thì bn định nghĩa như implicit.ngược li nếu bạn biết việc
ép kiểu thể đi đến sự liều lĩnh - mất dữ liệu hay một biệt lệ sbtung ra -
bạn nên định nghĩa ép kiểu như là explicit.
Bạn nên định nghĩa bất kỳ kiểu ép kiểu mà bạn viết là tường minh nếu có bất
giá trdliệu nguồn nào việc ép kiểu có khả năng thất bại, hoặc nếu
có smạo hiểm do một biệt lệ được tung ra.
Cú pháp của việc định nghĩa ép kiểu cũng giống như việc overload thao tác .
không phi ngẫu nhiên mà ta i thế , bởi vì theoch ép kiểu được xem
như thao tác tác động của là chuyn tkiểu dữ liệu nguồn sang kiểu
dliu đích. để minh hoạ cho cú pháp này, cú pháp sau được lấy từ ví dụ mà
sẽ được giới thiệu sau đây trong phần này:
public static implicit operator float (Currency value)
{
// x
}
Đoạn mã y một phần của cấu trúc - currency - được dùng để u tr
tin.ép kiểu được định nghĩa đây cho phép chúng ta chuyển đổi 1 cách n
d giá tr của 1 kiểu tiền tệ sang 1 số thực ( float). chú ý rằng nếu việc
chuyển được khai báo như implicit, thì trình biên dịch cho phép s
dụng cả implicit và explicit. nếu nó được khai báo như explicit , thì trình
biên dịch chỉ cho phép nó sử dụng như là explicit.
Trong khai báo này việc ép kiểu được khai o là static. giống như các thao
tác được overload , C# đòi hỏi việc ép kiểu static. điều này nghĩa là
mỗi ép kiểu cũng lấy một thông số , mà là kiu dữ liệu trong nguồn
Thực hành ép kiểu dữ liệu do người sử dụng định nghĩa.
Trong phn này, chúng ta s xem xét việc ép kiu implicit và explicit của
kiểu dữ liệu này trong dSimplecurrency. trong dnày chúng ta định
nghĩa 1 cấu trúc struct, currency, mà gitiền USA. thông thường, C# cung
cấp kiu thập phân ( decimal) cho mục đích y, nhưng bạn vn thể viết
riêng 1 cu trúc struct hay một lớp để trình y giá trtiền nếu bạn muốn
biểu diễn quy trình tài chính phức tạp và do đó muốn có một phương thức c
thể để thực thi như một lớp.
cấu trúc của ép kiểu là giống nhau cho struct hay lp . trong dnày
struct, nhưng nó cũng làm vic tốt nếu bạn khai báo currency như là một lớp.
khởi đầu , định nghĩa cấu trúc currency như sau:
struct Currency
{
public uint Dollars;
public ushort Cents;
public Currency(uint dollars, ushort cents)
{
this.Dollars = dollars;
this.Cents = cents;
}
Việc dùng kiu dữ liệu không dấu cho trường Dollar và cent bảo đảm rằng
một thể hiện của currency chỉ giữ 1 số dương.chúng ta giới hạn nó bằng cách
này để thể minh hoạ một số điểm về tường minh sau này.để giữ cho lớp
đơn giản,ta chọn các trường public, nhưng nói chung bạn sẽ phải định
nghĩa chúng private, định nghĩa những thuộc tính đáp ng cho dollar và
cent
Chúng ta hãy bắt đầu bằng cách giả snhư là bạn muốn chuyển giá trị t
currency sang float, mà phn nguyên của kiểu float strìnhy dollar:
Currency balance = new Currency(10,50);
float f = balance; // ta muốn f được đặt là 10.5
Để cho phép làm điều này , cn định nghĩa 1 ép kiểu. tđây ta thêm vào
trong cu trúc currency:
public static implicit operator float (Currency value)
{
return value.Dollars + (value.Cents/100.0f);
}
Ép kiu này implicit, Đây là sự chọn lựa dễ nhận thấy , bởi vì , nó nên
ràng tđịnh nghĩa trong currency, bất kì giá trnào u trtrong currency
cũng có thể lưu trong kiểu float.
Nếu chuyển ngược thì sao? tmột số float sang currency .trong trường hợp
này việc chuyển đổi thể không làm việc ,nếu float lưu tr s âm,n
currency thì không , s này s lưu tr phần làm tròn vào trong trường
dollar của currency.nếu float chứa đựng một giá tr không thích hợp việc
chuyển nó sẽ y ra một kết quả không dự đoán truớc. do đó việc chuyển đổi
này nên được khai báo là explicit. sau đây đoạn mã th đầu tiên , tuy
nhiên nó kng gửi kết quả hoàn toàn đúng:
public static explicit operator Currency (float value)
{
uint dollars = (uint)value;
ushort cents = (ushort)((value-dollars)*100);
return new Currency(dollars, cents);