一、 无参属性

1. 定义属性

无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断。属性的定义其实不复杂,先看个直观的例子:

说明:

  • 属性要定义名称和类型,且类型不能是void。
  • 属性是不能重载的。我们不能定义名称相同、类型不同的两个属性。
  • 属性一般需要定义get和set方法来操作类内部的私有支持字段,如上面的_name, _age等。Set方法中包含隐藏参数叫做value,表示赋给属性的值。
  • 只读只写属性:可以通过省略set来定义只读属性(如Count属性),或者省略get来定义只写属性。
  • CLR支持静态、实例、抽象和虚属性。例子中的Name和Age就是我们最常用的实例属性,Count就是静态只读属性的例子。
  • 属性字段最好是Private,以免被破坏字段

调用:使用属性时会产生相应的智能感知,就像使用公用字段一样:

运行结果:

2. 编译结果

通过ILDasm.exe查看元数据,

我们发现多了以下几项:

① 如果属性包含get访问器,则会生成“get_属性名” 的方法,如get_Age;

② 如果属性包含set访问器,则会生成“set_属性名”的方法,如set_Name;

③ 元数据中的属性定义项,包含了一些标记和属性类型,并引用了get或set访问器方法,这样就使属性和访问器之间产生了关联。例如Count属性定义项内容:

3. 自动实现的属性——AIP

AIP(Automatically Implemented Property)是实现属性的一种更简洁的方式。例如上面的Student类,可以简化为:

调用方式和运行结果与之前一致,这里就不赘述了。

简洁固然好,但要注意以下几点:

① AIP的get和set方法中不能添加断点调试。

② AIP属性必须是同时可读可写的。如果只定义get或者只定义set,则必须两个都显式实现,不能使用AIP。

③ 想要序列化或者反序列化的类中,不要定义AIP。因为运行时序列化引擎将字段名持久化到了序列化流中,而且每次编译时这个名字还有可能改变。

4,对象和集合初始化器

Employee e=new Employee(){Name="Jeff",Age=45} //构造一个Employee对象并初始化,调用它的无参构造

String s=new Employee(){Name="jeff",Age=45}.ToString().ToUpper()//构造一个Employee对象,调用构造器,初始化两个公共属性,调用Tostring ,调用Toupper

String s=new Employee{Name="jeff",Age=45}.ToString().ToUpper()//如果调用的本来就是一个无参构造器,还允许省略大括号。

如果属性的类型实现了IEnumerable或IEnumeratble<T>接口,属性会被认为是一个集合。集合的初始化会被认为是一个相加操作,而非替换操作

public sealed class Class Classroom{

private List<String> m_students=new List<String>();

public  List<String> Students{get{return m_students;}}

public class(){}

}

public static void M(){

Classroom classromm=new Classroom{

Students={"jeff","krstin","aidan","gran"}

} ;

}

还可以这样子添加

var table=new Dictionary<string ,int32>{

{"jeff",1},{"Kristin",2},{"aidn",3},{"grant",4}

}

二、 有参属性——索引器

索引器是访问器包含参数的属性, C#是以数组的风格来公开索引器的。

1. 定义索引器。

① 和无参属性类似,索引器也需要定义get,set访问器,并且在set访问器中可以使用value关键字。不同的是,索引器的get访问器需要接受参数。

② 要使用this关键字定义索引器。

调用:索引器使得对象可按照与数组相似的方法进行索引。

2. 编译结果

查看ILDasm.exe。

编译之后与无参属性类似,只不过编译器为访问器采用了默认名称Item:

① 如果索引器包含get访问器,则会生成“ get_Item” 的方法;

② 如果索引器包含set访问器,则会生成“set_Item”的方法;

③ 元数据中的属性定义项。

3. 注意事项

① 默认产生的Item名称是可以修改的。可以通过向索引器添加“IndexerName”的attribute来实现。例如:

② 索引器可被重载。在C#中,一个类可以定义多个索引器,只要索引器的参数集不同即可。

③ 索引器可以有多个形参,例如当访问二维数组时。

④ 索引器只能用于实例,不能用于静态。


THE END。

终于写完了。饿死了,吃饭,回家。

最新文章

  1. 读取 java.nio.ByteBuffer 中的字符串(String) 写入方式flash.utils.ByteArray.writeUTF
  2. (原创)详解Quartus导出网表文件:.qxp和.vqm
  3. iOS stringByEvaluatingJavaScriptFromString的参数长度限制
  4. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。
  5. Python中的库使用之一 PIL
  6. hdu 1233 还是畅通工程 解题报告
  7. 编辑并列DIV
  8. win 8.1 安装framework3.5
  9. HTML5:离线存储(缓存机制)-IndexDB
  10. Python的类变量和对象变量声明解析
  11. CentOS6 配置
  12. PureMVC(JS版)源码解析(十):Controller类
  13. ArcGis API FOR Silverlight 做了个导航工具~
  14. git本地仓库与github远程仓库链接协议问题
  15. String源码图
  16. Markdown常用快捷键
  17. .net 发布 web应用程序
  18. 关于mysql 5.7 版本登录时出现错误 1045的随笔
  19. java String、StringBuffer、StringBuild、StringTokenizer
  20. shell 判断目录是否存在

热门文章

  1. 关于js css html加载顺序整理
  2. python 中的unicode详解
  3. linux中tar命令用法
  4. hiho #1223 不等式
  5. Python 学习笔记四
  6. php之CI框架多语言的用法
  7. 9.4---集合子集(CC150)
  8. 跨域解决方案二:使用JSONP实现跨域
  9. 单独使用CKfinder上传图片
  10. kendoUI grid 过滤时出错:TypeError toLowerCase is not a function