2015-12-08 21 views
5

Gần đây, tôi đã phát hiện ra rằng indexer có thể chấp nhận một mảng các đối số như params:sử dụng thực tế của params indexer

public class SuperDictionary<TKey, TValue> 
{ 
    public Dictionary<TKey, TValue> Dict { get; } = new Dictionary<TKey, TValue>(); 

    public IEnumerable<TValue> this[params TKey[] keys] 
    { 
     get { return keys.Select(key => Dict[key]); } 
    } 
} 

Sau đó, bạn sẽ có thể làm:

var sd = new SuperDictionary<string, object>(); 
/* Add values */ 
var res = sd["a", "b"]; 

Tuy nhiên, Tôi chưa bao giờ gặp việc sử dụng như vậy trong .NET Framework hoặc bất kỳ thư viện của bên thứ ba nào. Tại sao nó được thực hiện? Cách sử dụng thực tế của việc giới thiệu chỉ mục params là gì?

+2

Tôi phải thừa nhận: đó là trường hợp sử dụng khá thú vị cho từ khóa 'params'. –

+0

Một bộ chỉ mục chỉ là đường cú pháp được áp dụng cho một phương pháp thông thường (với một thực thi rằng nó có ít nhất một tham số). Vì một phương thức bình thường có một danh sách * tham số chính thức * (được định nghĩa trong phần 10.6.1 của đặc tả ngôn ngữ C#) và một danh sách * tham số chính thức có thể bao gồm một tham số * *, nó có nghĩa là bạn có thể sử dụng ' params' với một người lập chỉ mục. –

Trả lời

1

Câu trả lời đã được tìm thấy sau một phút sau khi đăng câu hỏi và xem qua mã và tài liệu - C# cho phép bạn sử dụng bất kỳ loại nào làm tham số cho người lập chỉ mục, chứ không phải là trường hợp đặc biệt params.

Theo MSDN,

Indexer không cần phải được lập chỉ mục bởi một giá trị số nguyên; tùy bạn xác định cơ chế tìm kiếm cụ thể như thế nào.

Nói cách khác, trình lập chỉ mục có thể thuộc bất kỳ loại nào. Nó hoặc có thể là một mảng ...

public IEnumerable<TValue> this[TKey[] keys] 
{ 
    get { return keys.Select(key => Dict[key]); } 
} 

var res = sd[new [] {"a", "b"}]; 

hay bất kỳ loại một loại bất thường hoặc bộ sưu tập, bao gồm params mảng, nếu nó có vẻ là thuận tiện và phù hợp trong trường hợp của bạn.

+0

Tôi đoán rằng vì các chỉ mục được dịch thành các phương pháp trong IL nên không có gì đáng ngạc nhiên khi bạn có thể tạo điều kiện thuận lợi cho từ khóa 'params'. Tuy nhiên, có một sự khác biệt với các phương thức - trong khi bạn có thể gọi một phương thức hoàn toàn bỏ qua các đối số (mảng tham số sau đó được "tự động hóa" như là một mảng rỗng), bạn không thể gọi một trình chỉ mục mà không có bất kỳ đối số nào. – Grx70

Các vấn đề liên quan