CLR via C#(11)-无参属性、有参数属性(索引器)
一、 无参属性
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)-无参属性、有参数属性(索引器)的更多相关文章
- 《Inside C#》笔记(六) 属性、数组、索引器
一 属性 a) 属性可用于隐藏类的内部成员,对外提供可控的存取接口.属性相当于有些语言的getter.setter方法,只是使用起来更加方便一点,而且查看对应的IL码可以看到,属性的本质也确实是方法. ...
- 【Unity|C#】基础篇(7)——属性(Property)/ 索引器(Indexer)
[学习资料] <C#图解教程>(第6章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...
- MVC DateTime 字段 EditTime 必须是日期模板只能用于字段访问、属性访问、一维数组索引或单参数自定义索引器表达式
ASP.NET MVC 中model含有DateTime类型的字段 更新字段时提示:字段 EditTime必须是日期,. 但是明明填入的是日期还是给出这个提示, 看有的博客说那是因为日期形式错了,如果 ...
- JAVA基础——构造函数方法总结(有参构造和无参构造)
使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...
- C#索引器-有参属性
总结 只要类中有类似于属性的元素就应创建索引器,此属性代表的不是一个值,而是值的集合,其中每一个项由一组参数标识. 这些参数可以唯一标识应引用的集合中的项. 索引器延伸了属性的概念,索引器中的一个成员 ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- C#中方法,属性与索引器
C#中方法,属性与索引器: TODO: 1,关于系统中常常出现的通过某一字段,查询相应实体信息(可能是一条字段或一条数据和一组泛型集合) 解说篇:1,方法,2,属性3.索引器 1.方法(1.依据状态编 ...
- (转)c# 属性与索引器
属性是一种成员,它提供灵活的机制来读取.写入或计算私有字段的值. 属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法. 这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性. 一个简单 ...
- Java 第11章 类的无参方法
类的无参方法 类的方法由哪几部分组成? 方法的定义: 1.访问权限修饰符 2.方法返回的数据类型 3.方法的名称 4.方法的主体 成员变量和局部变量的区别有那些? ~ 作用域不同 - 成员变量的作用域 ...
随机推荐
- 跟着百度学PHP[4]-OOP面对对象编程-1-什么是面对对象编程
该阶段学习参考:http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/10/1823042.html 面向对象编程(Object Orie ...
- Selenium Webdriver元素定位的常用方式
单选框.复选框.文本框和密码框的元素标签都是input,此时单靠tagName无法准确地得到我们想要的元素,需要结合type属性才能过滤出我们要的元素.示例代码如下: public class Sea ...
- HttpGet
private static void func_httpGet(String url) { HttpClient httpClient = new HttpClient(); try { GetMe ...
- Hifiman:一个国产音频厂商的忧伤[转]
一则苹果计划32亿美元收购音频设备厂商Beats的消息,让音频设备——这个极少被人们重视又时刻离不开的产品重新引发了关注. 国产数码品牌通常都被自然的贴上低端.低质的标签.然而难能可贵的是,国产音频设 ...
- leetcode Add and Search Word - Data structure design
我要在这里装个逼啦 class WordDictionary(object): def __init__(self): """ initialize your data ...
- 快速搭建VPN服务器
http://www.ttlsa.com/linux/centos-install-pptp-vpn/
- rebot的使用
rebot简要使用方法介绍 在介绍rebot前,首先说一下RobotFramework(后称RF)的主要输出文件. 当我们执行完一个RF脚本后,RF会输出3种文件.分别是Output.Log和Re ...
- linux多线程下载工具mwget
linux多线程下载工具mwget 经常使用wget进行文件下载,然而wget的处理速度并不如人意.遇到一些国外的站点,经常慢得像蜗牛一般.然而为了解决这个问题,便有了mwget:m表示multi多线 ...
- NSIS脚本入门和进阶方法
NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序.它提供了安装.卸载.系统设置.文件解压缩等功能.对于新手来说,它有 ...
- 《Java多线程核心技术》读书摘要
Chapter1: 进程是操作系统管理的基本单元,线程是CPU调到的基本单元. 调用myThread.run()方法,JVM不会生成新的线程,myThread.start()方法调用两次JVM会报错. ...












