全部,我遇到了以下属性和对象声明。第一个返回一个接口,第二个我不太确定
public IConfig this[int index]
{
get { return (IConfig)configList[index]; }
}
object IList.this[int index]
{
get { return configList[index]; }
set { }
}
我从未见过这种类型的声明,即带有方括号的public IConfig this[int index]
以及this
和object IList.this[int index]
的奇怪使用。有人可以解释这两个符号吗?
我试图查看我的书籍,并使用谷歌,但我不确定我在寻找什么。谢谢你的时间。
编辑。它们属于一个继承如下的类
public class ConfigCollection : ICollection, IEnumerable, IList
{
....
}
答案 0 :(得分:12)
它被称为indexer
,允许您在从对象获取元素时执行instance[1];
。您可以在implementing IList
上查看此答案作为参考
答案 1 :(得分:3)
我还想在Johan的帖子中再添加一个细节 - 由于多个接口,你实际上有2个索引器在该类中继续。
从IList
实现的索引器是显式声明的,因此默认情况下不会调用此索引器。如果要使用IList
版本的索引器,则需要执行此操作:
ConfigCollection thisCollection = GetCollectionItems();
// this invokes the IList.this indexer....
var firstItem = ((IList)thisCollection)[0];
// this invokes the other indexer
var firstItemAsIConfig = thisCollection[0];
根据您与我们分享的代码,我认为IList.this
索引器是多余的。
答案 2 :(得分:1)
说你有
public class MyAggregate
{
private List<String> _things;
public MyAggregate()
{
_things = new List<String>();
}
}
所以你可以添加
public String GetItem(int argIndex)
{
return _things[argIndex];
}
和
public void SetItem(int argIndex, String argValue)
{
_things[argIndex] = argValue;
}
然后通过myAggregate.GetItem(0)
访问以获取它并myAggregate.SetItem(0,"Thing")
进行设置。
或者你可以添加
public string this[int argIndex]
{
get {return _things[argIndex];}
set { _things[argIndex] = value;}
}
并通过myAggregate[0]
访问它以获取它并myAggregate[0] = "Thing"
进行设置。
后者往往感觉更自然,每次都不需要提出两个方法名称。