一、 无参属性

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. Linus爱GPL 但不喜欢GPL诉讼

    导读 在上周多伦多举行的LinuxCon NA会议上,Linus Torvalds 和 VMware 副总裁 Dirk Hohndel讨论了 GNU GPL 在 Linux 成功上所起的作用.Hohn ...

  2. js之DOM和事件

    DOM 查找 直接查找 var obj = document.getElementById('i1') 间接查找 文件内容操作: innerText 仅文本 innerHTML 全内容 value i ...

  3. SVN的目录说明

    subversion目录说明:*dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据*db目录:就是所有版本控制的数据存放文件*hooks目录:放置hook脚本文件的目 ...

  4. 7.2---蚂蚁相遇问题(CC150)

    public class Ants { public double antsCollision(int n) { // write code here return (1 - Math.pow(0.5 ...

  5. PHP MVC 中的MODEL层

    Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封 三.实现你的Mode层 Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封,进行他的设计的时候设计到三个 ...

  6. linux 终端报错 Out of memory: Kill process[PID] [process name] score问题分析

    从Out of memory来看是内存超出了,后面的 Kill process[PID] [process name] score好像和进程有关了,下面我们就一起来看看linux 终端报错 Out o ...

  7. Resizing the disk space on Ubuntu Server VMs running on VMware ESXi 5

    from: http://www.joomlaworks.net/blog/item/168-resizing-the-disk-space-on-ubuntu-server-vms-running- ...

  8. 64位系统运行32位Oracle程序解决方案

    Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...

  9. CSS3 text-overflow 属性

    1. <!DOCTYPE html> <html> <head> <style> div.test { white-space:nowrap; widt ...

  10. C# 中的virtural和abstract

    一. Virtual 方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual 的使用有两种情况: 1.在基类中定义了virtual方法,但是派生类中没有重写该虚方法,那么在对派生类 ...