WEB开发网
开发学院软件开发C语言 C# 4.0新特性-索引属性 阅读

C# 4.0新特性-索引属性

 2010-09-30 22:35:20 来源:WEB开发网   
核心提示: 从这些代码不难看出C# Team对索引属性的观点,他们认为索引器的职责应该属于属性返回的对象的,C# 4.0新特性-索引属性(3),而不是属于该属性的父对象,父对象无法通过索引值来控制属性返回值,这时候它查找的其实是get_属性名(index)这种格式,如果能找到,你添加到属性上的索引其实是对集

从这些代码不难看出C# Team对索引属性的观点,他们认为索引器的职责应该属于属性返回的对象的,而不是属于该属性的父对象,父对象无法通过索引值来控制属性返回值。你添加到属性上的索引其实是对集合或者数组操作,而不是由IndexTest在自己内部控制。从这个观点上将,我们就不难理解为什么C# 4.0仅仅支持COM的索引属性了。

索引属性的实现

目前的C# 4.0并不支持声明索引属性,它仅仅在COM中使用,在用户引用COM对象的时候,编译器会从COM类型中(标有tdImport标志的类型)导入所有看起来像索引属性的成员,然后提供给用户。通过这种方式,用户现在可以通过属性索引器语法形式来访问这些成员。下面我们根据上面的例子来看看具体过程。

当编译器碰到索引属性的情况时,它会绑定.号左边的对象即it,然后它会获取it的对象类型即IndexTest,接着,它会去IndexTest类中查找所有名称为somePropertys的成员。

为了向后兼容,编译器优先考虑的是属性名匹配,而不去考虑这个属性返回值是不是真的支持索引属性。从这个角度来看,索引属性有点像扩展方法,只有当正常的方法匹配都失效的时候,它们才会被用到。举例来说吧,如果编译器在IndexTest中找到了一个普通的属性名字叫做somePropertys,它仍认为这个属性就是用户想要调用的,即使这个属性somePropertys并没有实现索引器或不是一个数组。接着,当编译器发现这个属性的返回值并不支持索引器,这时候匹配失败,编译器会报错。

当编译器找不到正常的属性跟待查找的名字一致时候,它会去检查IndexTest是不是COM类型,如果是的话,它会用与重载函数类似的匹配方式在所有符合条件的索引属性中找到匹配的成员,这时候它查找的其实是get_属性名(index)这种格式,如果能找到,编译器则把匹配的方法当做索引化属性调用。e.g. 上例中的索引属性其实IL代码类似IndexTest.get_somePropertys(index).

上一页  1 2 3 4  下一页

Tags:特性 索引 属性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接