C# params索引器的实际应用
最近,我发现indexer可以接受参数数组作为C# params索引器的实际应用,c#,parameter-passing,variadic,indexer,params-keyword,C#,Parameter Passing,Variadic,Indexer,Params Keyword,最近,我发现indexer可以接受参数数组作为params: public class SuperDictionary<TKey, TValue> { public Dictionary<TKey, TValue> Dict { get; } = new Dictionary<TKey, TValue>(); public IEnumerable<TValue> this[params TKey[] keys] {
params
:
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]); }
}
}
公共类超级字典
{
公共字典Dict{get;}=new Dictionary();
public IEnumerable this[params TKey[]keys]
{
获取{返回键。选择(键=>Dict[key]);}
}
}
然后,您将能够执行以下操作:
var sd = new SuperDictionary<string, object>();
/* Add values */
var res = sd["a", "b"];
var sd=new SuperDictionary();
/*增加价值*/
var res=sd[“a”,“b”];
然而,我从未在.NETFramework或任何第三方库中遇到过这种用法。为什么要实施?能够引入
params
indexer的实际用途是什么?在发布问题并查看代码和文档后,一分钟内就找到了答案-C允许您使用任何类型作为indexer的参数,但不能将params
作为特例
根据,
索引器不必按整数值编制索引;如何定义特定的查找机制取决于您
换句话说,索引器可以是任何类型。它可以是一个数组
public IEnumerable<TValue> this[TKey[] keys]
{
get { return keys.Select(key => Dict[key]); }
}
var res = sd[new [] {"a", "b"}];
public IEnumerable此[TKey[]键]
{
获取{返回键。选择(键=>Dict[key]);}
}
var res=sd[new[]{“a”,“b”}];
或者任何一种不寻常的类型或集合,包括
params
array,如果它看起来对您的情况方便且合适的话。我必须承认:对于params
关键字来说,这是一个非常时髦的用例。索引器只是应用于普通方法的语法糖分(强制要求它至少有一个参数)。因为普通方法采用正式的参数列表(定义见C语言规范第10.6.1节)一个正式的参数列表可能包含一个参数数组,这意味着您可以将params
与索引器一起使用。我想,由于索引器在IL中被转换为方法,所以您可以方便地使用params
关键字也就不足为奇了。不过,方法有一个不同之处——尽管您可以调用一个完全忽略a的方法rguments(参数数组被“自动”实例化为空数组),您不能在没有任何参数的情况下调用索引器。