改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)
改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员
序
为什么我们的程序运行得棒棒的,还要改呢?Why?
答:我们要让程序运行得更快,执行的效率更高,代码的可读性更强,维护的成本更低... ...。
目录
- 属性介绍
- 属性的另一种形式 - 索引器介绍
- 小结
属性
属性是 C# 中的一等公民。我们可以为 setter 和 getter 指定不同的访问权限,属性允许将数据成员作为公共接口的一部分暴露出去,与此同时,也能够进行一定的封装。
属性的使用跟数据成员的使用一样,但底层依然是通过方法来实现的。
我们在访问属性的时候,实际上调用的是方法的接口,所以可以享受到方法调用的所有好处。
其实,通过 VS 我们可以直接键入 prop + 两次 TAB 键,就可以快速完成属性的编写。

图1 隐式属性
一般来说,我们直接使用 C# 3 的隐式属性语法即可,并且不需要给 getter 和 setter 加上其它验证逻辑。
属性可以拥有方法的所有语言特性,如:使用 virtual,abstract 等关键字。

图2
我们也可以使用访问修饰符对 getter 和 setter 制定不同的访问权限,这样就可以更精妙的控制数据成员的可见性。
public int Id { get; protected set; }
我们可以通过 IL 代码对比下隐式属性语法所生成的代码和过去写法生成的代码有什么不同。
public class Person
{
public int Id { get; set; } private string _name; public string GetName()
{
return _name;
} public void SetName(string name)
{
_name = name;
}
}

图3
从上图可知,隐式属性在 IL 也会生成类似 _name 的字段 <Id>k__BackingField(虽然名字有点奇葩),同时也会生成 getXX 和 setXX 方法。
索引器介绍
索引器又称含参属性(parameterized property)。this 是索引器的关键字。
【注意】所有的索引器都必须使用 this 关键字来进行声明,不能指定其他名称。即,对于同样的参数列表,只能,只允许有一个索引器。
当然,索引器也可以使用 virtual(虚),abstract(抽象)关键字。
同时,索引器的参数可以是一维数组,也可以是多维数组。
public class Person
{
public int Id { get; set; } public string Name { get; set; } public string this[int index]
{
get { return Name; }
set { Name = value; }
} public int this[string name]
{
get { return Id; }
set { Id = value; }
} public string this[int x, int y]
{
get { return Name; }
set { Name = value; }
}
}
【原文】http://www.cnblogs.com/liqingwen/p/6294290.html
【博主】反骨仔
改善 C# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)的更多相关文章
- 《Effective C#》读书笔记-1.C# 语言习惯-1.使用属性而不是可访问的数据成员
思维导图: 大纲: 1.使用属性而不是可访问的数据成员 属性 指定不同的访问权限 隐式属性降低了声明属性的工作量 允许将数据成员作为公共接口的一部分暴露 ...
- 《C#高效编程》读书笔记01-使用属性而不是可访问的数据成员
在需求变更中,属性比数据成员更容易修改,例:客户对象不该与空白名称,若你使用公有属性封装Name,那么现在修改一处,而数据成员则可能要修改多处 public class Customer { priv ...
- [.NET] 《C# 高效编程》(一) - C# 语言习惯
C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Con ...
- [.NET] 《Effective C#》快速笔记(一)- C# 语言习惯
<Effective C#>快速笔记(一)- C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 ...
- 《Effective C#》快速笔记(一)- C# 语言习惯
目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Conditional ...
- C# 语言习惯
目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Conditional ...
- C语言关键字register、extern、static、一些总结,及项目中使用的心得
首先介绍两个概念: 一.变量的生存周期: 变量从建立到撤销的时间段成变量的生存周期.静态变量,从变量产生到整个程序执行结束.当函数使用变量结束后,变量的存储空间依然存在,变量的值也会随着函数的对其的使 ...
- Swift2.0语言教程之类的属性
Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...
- Xamarin XAML语言教程使用Progress属性数据绑定设置进度条进度
Xamarin XAML语言教程使用Progress属性数据绑定设置进度条进度 开发者除了可以为ProgressBar定义的Progress属性直接赋双精度类型的值外,还可以通过数据绑定的方式为该属性 ...
随机推荐
- 在Centos中安装mysql
下载mysql 这里是通过安装Yum源rpm包的方式安装,所以第一步是先下载rpm包 1.打开Mysql官网 https://www.mysql.com/, 点击如图选中的按钮 点击如图框选的按钮 把 ...
- java points[复习]
1 - & 与 && 的区别: &:不管左边是true还是false,右端都会进行运算: &&:当左端为false时,右端不再进行运算: 即在与运算时, ...
- angular学习笔记(三)
1.安装npm install --save @angular/material@2.0.0-beta.72.安装http://chrome-extension-downloader.com安装aug ...
- 逆天的 GRUB
参考资料 GRUB 的文档在这里:https://www.gnu.org/software/grub/manual/grub/ Linux 的启动过程和 GRUB 的地位 Linux 系统启动的过程是 ...
- CS20SI-tensorflow for research笔记: Lecture1
本文整理自知乎专栏深度炼丹,转载请征求原作者同意. 本文的全部代码都在原作者GitHub仓库github CS20SI是Stanford大学开设的基于Tensorflow的深度学习研究课程. 什么是T ...
- [Swift]LeetCode108. 将有序数组转换为二叉搜索树 | Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...
- [Swift]LeetCode162. 寻找峰值 | Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array nums, where nu ...
- [Swift]LeetCode1005. K 次取反后最大化的数组和 | Maximize Sum Of Array After K Negations
Given an array A of integers, we must modify the array in the following way: we choose an i and repl ...
- Kubernetes 笔记 06 豌豆荚之旅(一)
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...
- 1、MySQL主从同步机制及同步中的问题处理
http://www.drupal001.com/2012/03/mysql-master-slave-troubles/ http://www.jb51.net/article/33052.htm