Thành viên có thân biểu thức
Thuộc phần Lập trình hướng đối tượng trong hành trình C# của Coddy. Bài học 14 trên 70.
Các thành viên có thân biểu thức cung cấp cú pháp ngắn gọn cho những thành viên chỉ chứa một biểu thức. Thay vì viết đầy đủ thân phương thức hoặc thuộc tính bằng dấu ngoặc nhọn, bạn dùng cú pháp mũi tên =>.
Với các phương thức (method) chỉ trả về một biểu thức, bạn có thể thay thế toàn bộ phần thân:
// Phương thức truyền thống
public int Add(int a, int b)
{
return a + b;
}
// Phương thức có phần thân là biểu thức
public int Add(int a, int b) => a + b;Cú pháp này cũng dùng được với thuộc tính chỉ đọc, bạn đã thấy qua ở phần trước:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Bạn cũng có thể dùng thân biểu thức cho riêng từng hàm getter và setter của thuộc tính:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Ngay cả hàm khởi tạo cũng có thể dùng cú pháp này khi chỉ chứa một câu lệnh:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Thành viên có thân biểu thức (expression-bodied members) giúp code dễ đọc hơn khi logic đơn giản. Hãy dùng chúng cho các thao tác đơn giản, nhưng hãy giữ cách viết thân hàm truyền thống khi cần nhiều câu lệnh hoặc logic phức tạp.
Thử thách
DễHãy cùng xây dựng một bộ tính giá sản phẩm để thể hiện sức mạnh của các thành viên dạng biểu thức, giúp viết code gọn gàng và súc tích.
Bạn sẽ tạo hai tệp để sắp xếp code:
Product.cs: Định nghĩa lớpProducttrong không gian tênStore. Lớp này cần minh họa nhiều thành viên dạng biểu thức:- Một thuộc tính tự động triển khai
Name(chuỗi) vàBasePrice(số thập phân) - Một hàm khởi tạo dạng biểu thức để thiết lập cả hai thuộc tính
- Một thuộc tính chỉ đọc dạng biểu thức
TaxAmountđể tính 10% giá cơ bản - Một thuộc tính chỉ đọc dạng biểu thức
TotalPriceđể trả về giá cơ bản cộng với tiền thuế - Một phương thức dạng biểu thức
GetDiscount(decimal percentage)để trả về số tiền giảm giá (giá cơ bản nhân với tỷ lệ phần trăm rồi chia cho 100) - Một phương thức dạng biểu thức
GetFinalPrice(decimal discountPercentage)để trả về tổng giá trừ đi khoản giảm giá
- Một thuộc tính tự động triển khai
Program.cs: Trong tệp chính, tạo mộtProductbằng các giá trị đầu vào, sau đó hiển thị chi tiết giá.
Bạn sẽ nhận ba đầu vào:
- Tên sản phẩm
- Giá cơ bản
- Tỷ lệ phần trăm giảm giá cần áp dụng
In chi tiết giá theo định dạng này:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}Ví dụ: nếu đầu vào là Laptop, 1000 và 15, đầu ra sẽ là:
Product: Laptop
Base Price: 1000.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00Định dạng mỗi giá trị tiền tệ với chính xác hai chữ số thập phân, chẳng hạn như value.ToString("F2") hoặc $"{value:F2}". Quy tắc này áp dụng như nhau cho giá cơ bản, tiền thuế, tổng giá, khoản giảm giá và giá cuối cùng.
Nhớ dùng cú pháp mũi tên => cho mọi thành viên chỉ chứa một biểu thức. Cách này giúp code gọn gàng và dễ đọc!
Tự làm thử
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Đọc các giá trị đầu vào
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// Tạo đối tượng Product từ các giá trị đầu vào
Product product = new Product(name, basePrice);
// Tính số tiền giảm giá bằng phương thức GetDiscount
decimal discountAmount = product.GetDiscount(discountPercentage);
// Tính giá cuối cùng bằng phương thức GetFinalPrice
decimal finalPrice = product.GetFinalPrice(discountPercentage);
// In ra chi tiết giá theo định dạng yêu cầu:
Console.WriteLine($"Product: {product.Name}");
Console.WriteLine($"Base Price: {product.BasePrice:F2}");
Console.WriteLine($"Tax (10%): {product.TaxAmount:F2}");
Console.WriteLine($"Total Price: {product.TotalPrice:F2}");
Console.WriteLine($"Discount ({discountPercentage}%): {discountAmount:F2}");
Console.WriteLine($"Final Price: {finalPrice:F2}");
}
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợpTự luyện tập: Trình biên dịch C# online