一、 无参属性

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。

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

CLR via C#(11)-无参属性、有参数属性(索引器)的更多相关文章

  1. 《Inside C#》笔记(六) 属性、数组、索引器

    一 属性 a) 属性可用于隐藏类的内部成员,对外提供可控的存取接口.属性相当于有些语言的getter.setter方法,只是使用起来更加方便一点,而且查看对应的IL码可以看到,属性的本质也确实是方法. ...

  2. 【Unity|C#】基础篇(7)——属性(Property)/ 索引器(Indexer)

    [学习资料] <C#图解教程>(第6章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...

  3. MVC DateTime 字段 EditTime 必须是日期模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式

    ASP.NET MVC 中model含有DateTime类型的字段 更新字段时提示:字段 EditTime必须是日期,. 但是明明填入的是日期还是给出这个提示, 看有的博客说那是因为日期形式错了,如果 ...

  4. JAVA基础——构造函数方法总结(有参构造和无参构造)

    使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...

  5. C#索引器-有参属性

    总结 只要类中有类似于属性的元素就应创建索引器,此属性代表的不是一个值,而是值的集合,其中每一个项由一组参数标识. 这些参数可以唯一标识应引用的集合中的项. 索引器延伸了属性的概念,索引器中的一个成员 ...

  6. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  7. C#中方法,属性与索引器

    C#中方法,属性与索引器: TODO: 1,关于系统中常常出现的通过某一字段,查询相应实体信息(可能是一条字段或一条数据和一组泛型集合) 解说篇:1,方法,2,属性3.索引器 1.方法(1.依据状态编 ...

  8. (转)c# 属性与索引器

    属性是一种成员,它提供灵活的机制来读取.写入或计算私有字段的值. 属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法. 这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性. 一个简单 ...

  9. Java 第11章 类的无参方法

    类的无参方法 类的方法由哪几部分组成? 方法的定义: 1.访问权限修饰符 2.方法返回的数据类型 3.方法的名称 4.方法的主体 成员变量和局部变量的区别有那些? ~ 作用域不同 - 成员变量的作用域 ...

随机推荐

  1. [codevs1154][COJ0177][NOIP2006]能量项链

    [codevs1154][COJ0177][NOIP2006]能量项链 试题描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这 ...

  2. Github如何更新远程代码

    1.git add . 2.git commit -m "Second commit" 3.git push origin master

  3. ASC47B borderless

    题目描述 border集合为{NULL,str}的串str称为borderless串. border即KMP里的那个. 字符集{'a','b'},给定长度n,求第k(给定)小的borderless串. ...

  4. zend studio安装svn插件

    进入zend->Help->Install New Software 输入如下地址: http://subclipse.tigris.org/update_1.8.x 选择subclips ...

  5. CentOS 7 运行级别切换

    CentOS 7 之前的版本是通过 /etc/inittab 文件来定义系统运行级别: [sywu@wusuyuan ~]$ cat /etc/centos-release CentOS releas ...

  6. 【转】WebMagic-总体流程源码分析

    转自:http://m.blog.csdn.net/article/details?id=51943601 写在前面 前一段时间开发[知了]用到了很多技术(可以看我前面的博文http://blog.c ...

  7. [猜数字]把两个数和告诉A,积告诉B,求这两个数是什么

    1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少? 分析: 设和为S,积为M. 首先,A:我不知道. 说明:S可以分解成多个 ...

  8. 解读Unity中的CG编写Shader系列四(unity中的圆角矩形shader)

    转自 http://www.itnose.net/detail/6097625.html 上篇文章中我们掌握了表面剔除和剪裁模式 这篇文章将利用这些知识实现一个简单的,但是又很常用的例子:把一张图片做 ...

  9. iOS drawRect 和 awakeFromNib

    今天想在一个view上绘制一个虚线边框,百度到的代码如下: CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.frame = ...

  10. JStorm集群的部署

    JStorm是一个类似Hadoop MapReduce的系统,不同的是JStorm是一套基于流水线的消息处理机制,是阿里基于Storm优化的版本,和Storm一样是一个分布式实时计算的系统,从开发角度 ...