Tham số tùy chọn
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 48 trên 70.
Tham số tùy chọn cho phép bạn đặt giá trị mặc định cho các tham số của phương thức. Khi bên gọi không cung cấp giá trị cho tham số đó, chương trình sẽ tự động dùng giá trị mặc định.
Bạn tạo tham số tùy chọn bằng cách gán giá trị mặc định trong phần khai báo phương thức:
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// Cả hai lời gọi đều chạy
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!Các tham số tùy chọn phải đứng sau tất cả tham số bắt buộc. Bạn có thể có nhiều tham số tùy chọn và bên gọi có thể bỏ qua bất kỳ tham số nào từ bên phải:
public static void CreateUser(string name, int age = 0, bool isActive = true)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
CreateUser("Emma"); // Emma, Age: 0, Active: True
CreateUser("James", 25); // James, Age: 25, Active: True
CreateUser("Sarah", 30, false); // Sarah, Age: 30, Active: FalseGiá trị mặc định phải là hằng số tại thời điểm biên dịch, chẳng hạn như giá trị cố định, giá trị const hoặc biểu thức default. Bạn không thể dùng biến hoặc lệnh gọi phương thức làm giá trị mặc định. Vì vậy, tham số tùy chọn rất phù hợp với các thiết lập cấu hình và phương thức mà hầu hết bên gọi đều dùng các giá trị phổ biến.
Thử thách
DễHãy xây dựng một hệ thống thông báo sử dụng tham số tùy chọn (optional parameters) để định dạng thông báo linh hoạt. Bạn sẽ tạo một lớp tiện ích có thể gửi thông báo với các cài đặt tùy chỉnh, trong đó hầu hết các hàm gọi sẽ dùng giá trị mặc định phù hợp.
Bạn sẽ sắp xếp code trong hai tệp:
NotificationService.cs: Tạo lớpNotificationServicetrong không gian tênNotifications, với một phương thức minh họa tham số tùy chọn:SendNotification(string message, string priority = "Normal", bool addTimestamp = true)- Phương thức này sẽ trả về một chuỗi thông báo đã định dạng. KhiaddTimestamplà true, hãy thêm[TIMESTAMP]vào đầu thông báo. Định dạng sẽ là[Priority] Messagehoặc[TIMESTAMP] [Priority] Message, tùy theo cài đặt dấu thời gian.
Program.cs: Trong tệp chính, hãy minh họa cách hoạt động của tham số tùy chọn bằng cách gọiSendNotificationtheo ba cách khác nhau: dùng tất cả giá trị mặc định, ghi đè một tham số và ghi đè cả hai tham số tùy chọn.
Bạn sẽ nhận ba đầu vào:
- Thông báo thứ nhất (sẽ dùng tất cả giá trị mặc định)
- Thông báo thứ hai (sẽ dùng mức độ ưu tiên
"Urgent"với dấu thời gian mặc định) - Thông báo thứ ba (sẽ dùng mức độ ưu tiên
"Low"và không có dấu thời gian)
Gọi SendNotification ba lần và in ra từng kết quả:
- Lần gọi thứ nhất: chỉ truyền thông báo thứ nhất (dùng giá trị mặc định: mức độ ưu tiên
"Normal", bật dấu thời gian) - Lần gọi thứ hai: truyền thông báo thứ hai cùng mức độ ưu tiên
"Urgent"(dấu thời gian vẫn mặc định là true) - Lần gọi thứ ba: truyền thông báo thứ ba cùng mức độ ưu tiên
"Low"vàfalsecho dấu thời gian
Ví dụ, nếu đầu vào là System started, Server overload và Cache cleared, đầu ra sẽ là:
[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache clearedHãy chú ý cách cùng một phương thức xử lý gọn gàng cả ba trường hợp: hàm gọi chỉ cần chỉ định những gì muốn thay đổi so với giá trị mặc định!
Tự làm thử
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// Đọc ba thông báo
string message1 = Console.ReadLine();
string message2 = Console.ReadLine();
string message3 = Console.ReadLine();
// Tạo một instance của NotificationService
NotificationService service = new NotificationService();
// TODO: Gọi SendNotification ba lần và in ra từng kết quả:
// 1. Lần gọi đầu tiên: chỉ truyền message1 (dùng tất cả giá trị mặc định)
// 2. Lần gọi thứ hai: truyền message2 với mức ưu tiên "Urgent" (timestamp mặc định là true)
// 3. Lần gọi thứ ba: truyền message3 với mức ưu tiên "Low" và false cho timestamp
}
}
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