让人生气的特性——C#属性访问器不支持参数!

Welkin-Hu 2004-10-27 11:19:30
最近两月,边学边用C#。发现它有时很好用。有时让你气个半死!
今天写了一个集合类。想声明一个Item属性,用Index做定位参数。
刚开始这样写:
public object Item(int Index) {
get { ……}
}
编译后死活有个警告,说get后要有分号(想必是编译器把它当成函数了)。
后来,把参数声明(int Index)换成[int Index],连编译都不让过!
郁闷了半天,才在MSDN上找到集合类的示例代码,打开一看,它的Item根本不是属性,而是方法!

个人感觉,C#这种属性访问器语法,虽然很有创意,却很不好用。
不能设置参数是一个缺点。
get和set的可见域必须一样也是一个缺点(听说Visual Studio.net 2005改进了这一点)。
再有一个缺点是:虽然加了个访问器机制,还是没把类的域变量与属性过程融合起来。仍然要先声明变量,后声明访问器。这里面的重复工作太多了。

...全文
290 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hel_ 2004-10-28
  • 打赏
  • 举报
回复
我也认为C#确实不像DELPHI那样可以支持索引器,它只支持this[index]样式的索引,不支持this.Texts[i], this.Items[i]之类的索引,需要自己建立C#类。
lml789lml 2004-10-28
  • 打赏
  • 举报
回复
老外的书已经写得很明白了,属性两种,不带的就是你那种,带参的就是索引器,所以没必要折腾了。
阿哲Zell 2004-10-28
  • 打赏
  • 举报
回复
基类定义为: System.Collections.CollectionBase

public Object this[int Index]
{
get
{
return (Object)List[Index];
}
set
{
List[Index] = value;
}
}
这样写出来的是属性啊。。不明白楼主。
zys2000 2004-10-28
  • 打赏
  • 举报
回复
C#是不支持带参数的属性的,VB.net支持。其实两种语言还是有些区别,自己看着办吧。
我用C#的最大理由就是它带XML自动注释的功能:)
Welkin-Hu 2004-10-28
  • 打赏
  • 举报
回复
可能我举了例子有点不合适。让大家有点误解了。
就Item属性来说,用索引器当然是首选解决方法,用方法也完全合适。

我只是想看看除了索引器外,直接用属性行不行。
以前我用VB,属性可以带参数,有时是很方便的。
当然,任何属性过程都可以直接写方法代替。
但相信没有谁原意在类图中设计为属性的东西,在代码体现出来的是方法函数。




myhero811104 2004-10-28
  • 打赏
  • 举报
回复
楼上的都说了,楼主不要再抱怨了
OriesMap 2004-10-28
  • 打赏
  • 举报
回复
楼主说的属性访问器Item确实就是由两个方法组成,看网上介绍说的编译过的中间代码就是两个方法。由get和set构成的。确实是这样子的。但也不能说它不好。本来属性也应该是一段代码吗。还能说是另外的一种特殊东西吗。

楼主如何想实现你要的那个带(int Index),我觉得可以改用this[int Index]的索引器方法。
luyiping 2004-10-27
  • 打赏
  • 举报
回复
public object this[int Index]{
.....
}
这样不是很好吗?
关键要掌握C#的特性啊,而不是一味地抱怨语言的不好
该怎么样就怎么样吧
shuker 2004-10-27
  • 打赏
  • 举报
回复
属性本来就不能有参数的阿,这个你想一个实际的例子就能明白了
如果你需要传参数,应该这样:public object this[int index] {get{} set{}}

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧