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.方法的主体 成员变量和局部变量的区别有那些? ~ 作用域不同 - 成员变量的作用域 ...
随机推荐
- BZOJ3924——[Zjoi2015]幻想乡战略游戏
0.题意:动态维护带权中心 1.分析:妈的,这题做了一天,mdzzzzzzzzzzzzzzzzzz-.. 这个题是边权,我们首先要将边权转化成点权... 我们维护一个分支结构中到根的距离和,一个分支结 ...
- win32程序组成
程序代码+UI资源——RC编译器整合——>EXE档案. UI资源:二进制代码(借助工具产生,并以各种扩展名的文件存在),程序员必须在资源描述文档(.rc)中描述他们. RC编译器(RC.EXE) ...
- Nmap扫描手册
By:WHILE扫描类-sTTCP connect()扫描,完整的通话连接,容易被检测,会被记录日志.-sSTCP同步扫描,不完整的通话连接,很少有系统会记入日志.-sUUDP扫描-sAACK扫描用来 ...
- Kali Linux渗透基础知识整理(二)漏洞扫描
Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...
- Unity3D研究院之拓展系统自带组件的Inspector视图
转自 http://www.xuanyusong.com/archives/3455 using UnityEngine; using System.Collections; using UnityE ...
- 在本地计算机无法启动MYSQL服务错误1067进程意外终止
在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...
- 7. javacript高级程序设计- 函数表达式
1. 函数表达式 1.1 函数定义 函数定义的方式有两种:一种是函数声明,另一种就是函数表达式. (1). 函数声明:函数声明的重要特征就是函数声明提示,函数声明会在函数执行前执行 function ...
- Oracle分页语句
select * from (select A.*,rownum rd from (select * from [tablename] where [condition] order by [con ...
- Java for LeetCode 226 Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia: This problem wa ...
- C#创建和调用WebService详细教程
1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...