Từ khóa 'params'
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 47 trên 70.
Từ khóa (keyword) params cho phép một phương thức (method) nhận số lượng đối số (argument) cùng kiểu dữ liệu thay đổi. Thay vì yêu cầu bên gọi tự tạo mảng, bạn có thể truyền trực tiếp các đối số, ngăn cách bằng dấu phẩy.
Đặt params trước tham số mảng trong chữ ký phương thức:
public static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers)
total += n;
return total;
}
// Tất cả các lời gọi này đều hoạt động
Console.WriteLine(Sum(1, 2)); // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5)); // 15
Console.WriteLine(Sum()); // 0 (mảng rỗng)Trình biên dịch tự động gói các đối số vào một mảng. Nếu đã có sẵn một mảng, bạn cũng có thể truyền trực tiếp mảng đó:
int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values)); // 60Có một vài quy tắc cần nhớ: một phương thức chỉ có thể có một tham số params, và tham số này phải đứng cuối danh sách. Bạn có thể kết hợp tham số này với các tham số thông thường:
public static void Log(string prefix, params object[] items)
{
foreach (var item in items)
Console.WriteLine(prefix + item);
}
Log("Item: ", "Apple", 42, true);Từ khóa params giúp API linh hoạt hơn và thuận tiện hơn cho bên gọi, đó là lý do bạn thấy nó trong các phương thức như Console.WriteLine và string.Format.
Thử thách
DễHãy tạo một trình định dạng thông điệp linh hoạt sử dụng từ khóa params để xử lý số lượng giá trị bất kỳ. Bạn sẽ tạo một lớp tiện ích có thể định dạng thông điệp với các đối số thay đổi, qua đó cho thấy params giúp các phương thức linh hoạt hơn và dễ gọi hơn.
Bạn sẽ sắp xếp code trong hai tệp:
MessageFormatter.cs: Tạo lớpMessageFormattertrong không gian tênFormattingvới hai phương thức sử dụngparams:Combine(params string[] parts): nối tất cả chuỗi được cung cấp, đặt một dấu cách giữa chúng, rồi trả về kết quảFormatList(string label, params int[] numbers): kết hợp một tham số thông thường với một mảngparams. Phương thức cần trả về nhãn, theo sau là dấu hai chấm, rồi đến tất cả số được phân tách bằng dấu phẩy (ví dụ:Scores: 85, 90, 78)
Program.cs: Trong tệp chính, hãy minh họa cả hai phương thức bằng các đầu vào. Đọc một chuỗi nhãn, rồi đọc một dòng gồm các số nguyên được phân tách bằng dấu phẩy. DùngCombineđể nối ba từ cố định, rồi dùngFormatListđể hiển thị nhãn cùng các số.
Bạn sẽ nhận hai đầu vào:
- Một chuỗi nhãn (ví dụ:
Scores) - Một danh sách số nguyên được phân tách bằng dấu phẩy (ví dụ:
85,90,78,92)
Trước tiên, gọi Combine với các từ "Hello", "params" và "world!", rồi in kết quả. Sau đó, phân tích các số nguyên được phân tách bằng dấu phẩy thành một mảng và gọi FormatList với nhãn cùng mảng số nguyên, rồi in cả kết quả đó.
Ví dụ: nếu đầu vào là Scores và 85,90,78, đầu ra sẽ là:
Hello params world!
Scores: 85, 90, 78Hãy chú ý cách Combine nhận trực tiếp số lượng chuỗi bất kỳ, còn FormatList cho thấy bạn có thể kết hợp tham số thông thường với params. Tham số params chỉ cần nằm cuối cùng. Bạn cũng có thể truyền một mảng có sẵn cho phương thức params, đúng như cách bạn sẽ làm với các số nguyên đã phân tích!
Tự làm thử
using System;
using Formatting;
class Program
{
public static void Main(string[] args)
{
// Đọc các giá trị đầu vào
string label = Console.ReadLine();
string numbersInput = Console.ReadLine();
// TODO: Dùng MessageFormatter.Combine với "Hello", "params" và "world!"
// và in kết quả ra
// TODO: Phân tích các số nguyên phân tách bằng dấu phẩy thành một mảng (array) int
// Gợi ý: Tách chuỗi và chuyển từng phần thành int
// TODO: Dùng MessageFormatter.FormatList với label và mảng int
// và in kết quả ra
}
}
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