Đối số có tê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 49 trên 70.
Đối số có tên cho phép bạn chỉ định tham số nào nhận giá trị bằng cách dùng tên của tham số đó, thay vì dựa vào vị trí. Cách này giúp lời gọi phương thức rõ ràng hơn và cho phép bạn truyền đối số theo bất kỳ thứ tự nào.
Hãy viết tên tham số, theo sau là dấu hai chấm rồi đến giá trị:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// Sử dụng đối số có tên (named arguments)
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // Thứ tự nào cũng đượcĐối số có tên phát huy tác dụng tốt khi kết hợp với tham số tùy chọn. Thay vì cung cấp tất cả các giá trị tùy chọn đứng trước, bạn có thể chuyển thẳng đến giá trị mình cần:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// Bỏ qua port và useSSL, chỉ chỉ định timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);Bạn có thể kết hợp đối số vị trí và đối số có tên, nhưng đối số vị trí phải đứng trước. Đối số có tên giúp code dễ đọc hơn, nhất là với các phương thức có nhiều tham số cùng kiểu dữ liệu hoặc các cờ boolean mà chỉ nhìn vào giá trị thì khó hiểu ý nghĩa.
Thử thách
DễHãy xây dựng một trình tạo báo cáo tận dụng đối số có tên để các lời gọi phương thức trở nên thật rõ ràng. Khi phương thức có nhiều tham số, đặc biệt là các tham số cùng kiểu hoặc cờ boolean, đối số có tên giúp code tự mô tả.
Bạn sẽ sắp xếp code trong hai tệp:
ReportGenerator.cs: Tạo lớpReportGeneratortrong namespaceReports, với một phương thức có một số tham số tùy chọn:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- Phương thức này cần trả về một chuỗi được định dạng, mô tả cấu hình báo cáo
- Định dạng:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: Trong tệp chính, minh họa sức mạnh của đối số có tên bằng cách gọiGenerateReporttheo nhiều cách khác nhau, bỏ qua các tham số tùy chọn bạn không cần và chỉ định những tham số cần thiết cho từng báo cáo.
Bạn sẽ nhận được ba đầu vào:
- Tiêu đề báo cáo thứ nhất
- Tiêu đề báo cáo thứ hai
- Tiêu đề báo cáo thứ ba
Tạo ba báo cáo với các cấu hình khác nhau:
- Báo cáo thứ nhất: Chỉ dùng tiêu đề, áp dụng tất cả giá trị mặc định
- Báo cáo thứ hai: Dùng tiêu đề cùng với
includeSummary: truevàmaxPages: 25, bỏ qua author và includeHeader để giữ nguyên các giá trị mặc định - Báo cáo thứ ba: Dùng tiêu đề cùng với
author: "Admin",includeHeader: falsevàincludeSummary: true, giữ nguyên giá trị mặc định của maxPages
In kết quả của mỗi báo cáo trên một dòng riêng.
Ví dụ, nếu các đầu vào là Sales Q1, Annual Review và Inventory Check, đầu ra sẽ là:
Report: Sales Q1 by Anonymous | Header: Yes, Summary: No, Max Pages: 10
Report: Annual Review by Anonymous | Header: Yes, Summary: Yes, Max Pages: 25
Report: Inventory Check by Admin | Header: No, Summary: Yes, Max Pages: 10Lưu ý rằng đối số có tên cho phép bạn bỏ qua trực tiếp đến những tham số cần dùng. Bạn không cần chỉ định author hoặc includeHeader chỉ để thay đổi includeSummary. Nhờ vậy, lời gọi phương thức dễ đọc hơn nhiều và thể hiện rõ ý định của bạn!
Tự làm thử
using System;
using Reports;
class Program
{
public static void Main(string[] args)
{
// Đọc tiêu đề của ba báo cáo
string title1 = Console.ReadLine();
string title2 = Console.ReadLine();
string title3 = Console.ReadLine();
// Tạo một instance của ReportGenerator
ReportGenerator generator = new ReportGenerator();
// TODO: Tạo báo cáo đầu tiên, chỉ dùng tiêu đề (các giá trị khác giữ mặc định)
// TODO: Tạo báo cáo thứ hai, dùng tiêu đề cùng includeSummary: true và maxPages: 25
// (bỏ qua author và includeHeader để giữ giá trị mặc định)
// TODO: Tạo báo cáo thứ ba, dùng tiêu đề cùng author: "Admin", includeHeader: false và includeSummary: true
// (giữ giá trị mặc định của maxPages)
// In ra kết quả của từng báo cáo
}
}
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