Tại sao các phương thức lấy số lượng tham số không giới hạn thường xác định tình trạng quá tải với ít tham số hơn?


36

Chẳng hạn, System.IO.Path.Combinephương thức trong .NET có các tình trạng quá tải sau:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

Điểm của ba cuối cùng là gì?

Cái đầu tiên sẽ bao gồm tất cả, như thể bạn nhìn kỹ, nó sử dụng paramstừ khóa. Đối số của khả năng tương thích ngược sẽ chỉ bao gồm các Combine(String, String)biến thể, vì nó là phiên bản duy nhất cho đến .NET 4.

Câu trả lời:


56

Lý do chính là cho hiệu suất. Đường cú pháp "không giới hạn" thực sự là một mảng của Chuỗi. Nếu bạn chỉ truyền một chuỗi, tại sao tạo một mảng chỉ có một chuỗi? Đặc biệt là nếu ~ 90% các yêu cầu của phương pháp này sẽ có từ 3 đối số trở xuống, thì không cần đối tượng mảng có trọng lượng nặng hơn. Bộ nhớ nhẹ hơn một chút và mất ít thời gian xử lý hơn vì bạn không cần một vòng lặp để xác định phương thức. Nếu bạn có ba chuỗi, bạn chỉ cần mã cho ba chuỗi.


Một điều khác cần lưu ý là việc chuyển Combinebằng 0 hoặc một đoạn đường dẫn thậm chí không có ý nghĩa, tuy nhiên paramsphiên bản cho phép bạn làm điều này.
Matthew

4
Lý do cho số lượng quá tải chấp nhận số lượng đối số khác nhau không phải để dễ đọc. Nó là cho hiệu suất vì chi phí phát sinh bằng cách tạo ra một chuỗi các chuỗi, và sau đó xử lý chúng. Lý do để chấp nhận params string[]là để dễ đọc.
Greg Burghardt

2
Hiệu suất thực sự là lý do và tôi tin rằng nó đặc biệt dành cho khi một chức năng được dự kiến ​​sẽ được gọi từ các vòng lặp bên trong . Như chú thích của Brad Abrams trên trang 27 của Ngôn ngữ lập trình C #, Ấn bản thứ ba nói: "Mô hình C # của anh ta tạo ra một phân bổ đối tượng bổ sung (mảng chứa) trong mỗi cuộc gọi. Điều này hiếm khi xảy ra, nhưng bên trong kịch bản loại -loop trong đó nó có thể không hiệu quả, chúng tôi khuyên bạn nên cung cấp quá tải cho các trường hợp chính và sử dụng paramsquá tải cho các trường hợp cạnh. Một ví dụ là StringBuilder.AppendFormat()gia đình quá tải. "
Eliah Kagan

3
@LowFellingPelican Mono và .NET Framework không giống nhau. Nếu bạn nhìn vào phiên bản .NET Framework , thì đây thực sự là một giải pháp hoàn toàn khác.
Alex

3
@LowFellingPelican: Lý do của .NET framework hiệu năng. Lý do của Mono để thực hiện phương pháp đó là khả năng tương thích API với .NET. Lý do của Mono để thực hiện phương pháp đó theo cách đó là đơn giản thực hiện (trên tài khoản của họ có ít tài nguyên hơn đáng kể so với Microsoft).
jhominal

4

Cú pháp đường.

Khi thao tác các đường dẫn tệp, việc có một số lượng nhỏ các giá trị cố định là cực kỳ phổ biến. Trong những trường hợp này, sẽ thuận tiện hơn khi sử dụng chúng trực tiếp hơn là phải gói chúng thành một mảng.


3
Với params, bạn đang làm phiền nó rồi. msdn.microsoft.com/en-us/l Library / w5zay9db.aspx Không cần một mảng.
Thomas Junk

3
Trong C #, bạn có một điểm, @Thomas. Tuy nhiên, .NET cũng hỗ trợ các ngôn ngữ khác mà không có params.
Karl Bielefeldt

@ThomasJunk Liên kết đó đã chết đối với tôi, thật không may, nhưng tôi chắc chắn rằng bạn đúng vì C # của tôi là tầm thường. Tôi vừa thấy nhiều thư viện có nhiều ngôn ngữ làm điều đó chỉ để cho phép mã sạch hơn.
Gort Robot
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.