• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

让人生气的特性——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改进了这一点)。
再有一个缺点是:虽然加了个访问器机制,还是没把类的域变量与属性过程融合起来。仍然要先声明变量,后声明访问器。这里面的重复工作太多了。

...全文
249 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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{}}
回复
相关推荐
C#基础教程-c#实例教程,适合初学者
C#基础教程-c#实例教程,适合初学者。...当然仅靠一章的内容就完全掌握C#语言是可能的,如需进一步学习C#语言,还需要认真阅读有关C#语言的专著。 1.1 C#语言特点 Microsoft.NET(以下简称.NET)框...
C# 基础——C#特性
.NET C# Web开发学习之路——C#特性 C#历史办版本及特性 语言版本 发布时间 .NET Framework要求 Visual版本 C# 1.0 2002.1 .NET Framework 1.0 Visual Studio .NET 2002 C# 1.1\1.2 2003...
C#进阶3-1】C#特性、反射、属性
二、C#特性 2-1、描述 首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。...
(2)C# 基础——C#特性
.NET C# Web开发学习之路——C#特性 C#历史办版本及特性 语言版本 发布时间 .NET Framework要求 Visual版本 C# 1.0 2002.1 .NET Framework 1.0 Visual Studio .NET 2002 C# 1.1\1.2 2003.4 ...
JavaWeb笔记
JavaWeb
测试开发笔记
测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 ...
WPF学习
首先感谢刘铁锰先生的《深入浅出WPF》,学习WPF过程碰上很多新概念,如Data Binding、路由事件,命令、各种模板等。 WPF:编写CS端的UI技术。 怎么去掉WPF窗体靠上多出黑色的长条?...(我自己觉得偶尔会用用这个) ...
C#专题——特性
一、特性的作用 将额外的数据关联到属性或者其它构造的一种方式 二、如何自定义特性 class TestAttribute:System.Attribute { public TestAttribute (string name) { this.Name = name; } public string Name...
LINQ体验(3)——C# 3.0新语言特性和改进(下篇)
上一篇我们介绍了C# 3.0新语言特性和改进上部分,这篇我们继续介绍剩下的部分。 C# 3.0新语言特性和改进包括: 自动属性(Auto-Implemented Properties) 隐含
C#——属性和方法(上)
C#——属性 属性和和方法是C#程序中的两个重要组成部分。 属性是提供灵活的机制来读取、编写或计算私有西促单的值。 方法则以一部分代码构成代码块的形式存在,用来实现一部分特定的功能。 属性的...
(14)C# 基础—— 字段和属性
.NET C# Web开发学习之路(13)—— 字段和属性 字段 字段是一种数据成员,其中容纳了一个值类型或者一个引用类型的引用。一般在类的内部做数据交互使用。字段就好比我们的个人所有财产,仅供个人使用,所以一般...
入门篇1——c# 语言介绍
C# 编程语言创造自2002年,它伴随着.NET Framework 框架而来,是.NET的主要支持语言之一。c#是一门纯面向对象的语言,在C#语言中所有的类型都是对象,随着微软.NET 5的发布,.NET一统天下的时代已经来临,而掌握c#也...
使C#代码现代化——第一部分:属性
什么是属性? 从Java到C# 经典方式 现代方式 自动属性 分配的属性 只读属性 属性表达式 Get和Set表达式 结论 介绍 近年来,C#已经从一种具有一个功能的语言发展成为一种语言,其中包含针对单个问题的...
《随笔二十五》——C#中的 “ 反射和特性
在程序集中使用C# 中已定义的特性 (485P) 使用 Obsolete 特性 来标识某段代码是已过时的(485P) 使用Conditional 特性 来禁止某些方法被调用(486P) 使用 CallerFilePath, CallerLineNumber, ...
MVC(4)——学习mvc的基础_C#语言的语言特性
一、简化C#属性——使用自动实现的属性 二、一次性创建对象并设置其属性——使用对象或集合初始化 三、对能修改的类添加功能——使用扩展方法 四、简化委托的使用——使用lambda表达式 五、隐含类型——使用var...
C#面向对象】第五课——类的继承、调用父类的构造方法、继承的特性
知识点:理解继承的概念 、 掌握在程序中实现继承、 掌握 base 和 protected 关键字 、掌握如何调用父类构造方法 、 掌握继承的特性 1、理解继承 面向对象有三大特性:封装、继承和多态。我们学习过封装,封装...
分布式服务框架
第2 章 分布式系统基础设施 chapter 第2 章 分布式系统基础设施 │ 59 一个大型、稳健、成熟的分布式系统的背后,往往会涉及众多的支撑系统,我们将这些支 撑系统称为分布式系统的基础设施。除了前面所介绍的分布式...
C#所有版本新特性
泛型是CLR 2.0中引入的最重要的新特性,使得可以在类、方法中对使用的类型进行参数化。 例如,这里定义了一个泛型类: class MyCollection<T> { T variable1; private void Add(T param) { } } ...
【C#面向对象】第九课——C#中的序列化和反序列化
知识点:理解序列化和反序列化的概念、掌握二进制序列化和反序列化的方法、掌握 XML 序列化和反序列化的方法。 1、序列化和反序列化概述 ...序列化和反序列化都是操作整个对象,和对象属性的多少没有关系。 ...
C#学习笔记10——C#泛型编程
在以前的C++中称为模板,C#泛型通过算法和数据结构支持独立编码。例如,泛型列表意味着,你不必再重写一个强类型集合。在本文中,作者将向你展示定义和使用泛型是多么容易的事情-请注意,长期以来泛型一直被认为是...
C#——一个简单的文件管理
最近在紧张的学习C#,说实话对C#之前没有太多的接触过,只知道C#特性与java很相似,接触了之后才发现C#跟java相比区别不是很多,但它是一门实现程序能力比Java还要好的语言(仅代表个人观点)。有许多新手在学习...
Unity3D学习2——C#学习
1、C# csharp Microsoft为.NET推出的高级编程语言。.NET是微软的多语言开发平台,用于构建和运行应用程序。 Mono是Novell公司支持在其他操作系统之下开发.NET程序的框架,而不是只适用于Windows。Unity借助Mono实现...
第 4 章—— C# 语言特性(《精通 ASP.NET MVC 5》)
 C# 的完整指南可参阅《Introducing Visual C#》、深度了解 LINQ 可参考《Pro LINQ in C#》 4.1 准备示例项目  为了演示语言特性,笔者用 “ASP.NET MVC 4 Application” 模板创建了一个新的 Visual Studio 项目...
Unity 3D游戏编程自学#2——C#面向对象
1.类与对象 类,简单来说就是高级版的结构体。类是用于描述一类事物的,而对象是某一种具体的类。比如说有一个类叫做“玩家”,类里面描述的是“玩家”的具体信息,那么小明就是属于“玩家”这类的一个具体的对象。...
C#脚本(01)——基本特性
1、Unity的C#脚本质上就是一个类,将其挂载到一个物体上,相当于在用该类来创建了一个对象,然后用对象来执行指定的动作。如果挂在物体上就无法创建实例。 2、能再脚本中写构造函数 3、脚本示例: 文件名与...
C#细节补充——进阶篇
ArrayList是一个C#为我们封装好的一个类,它的本质是一个object数组。 增 Add:增加一个object类型。 AddRange:增加一个ArrayList。 删 Remove:根据内容删除 RemoveAt:根据索引值删除。 Clear:清空。 查 查可以...
.Net C#(类的静态成员/属性)——学习笔记
类的静态成员与成员常量 静态字段: ...被所有实例共享,所有实例...静态函数可访问其他静态成员,但访问实例成员。 静态构造函数: 用于初始化类层次的项目,通常初始化静态字段。 类只可以有一
c#特性——概念篇(2)
重载方法:我的理解就是定义相同名称的方法,然后更具方法中参数的数据类型、个数、或顺序不同,判断调用那个方法。  重写方法:其实就是子类继承父类后,对父类的方法进行重新的定义。这里需要注意的是,父类的...
SSIM 指标说明 文章
介绍 SSIM 图像评价指标和由来,比较一般的图像质量评价标准,比较ssim 和尖峰信噪比的差异,等等,是英文资料
OpenGL ES2.0基础
初级学习OpenGL ES2.0的课程,从无到有,从进本的函数讲起,每一课时都附带一个例子程序。深入浅出的讲解可编程管线技术,令人费解的文理,以及混合技术,各种优化技术:顶点缓冲区,索引缓冲区,帧缓冲区,介绍精灵的使用,并使用shader制作粒子特效。 掌握OpenGL ES2.0可编程管线,以及OpenGLES2.0的特性,带领初学者入门。
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-10-27 11:19
社区公告

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