改善 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属性直接赋双精度类型的值外,还可以通过数据绑定的方式为该属性 ...
随机推荐
- Flask的上下文源码剖析
先写一段Flask程序 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return ...
- Python基础之自定义工具类
class ListHelper: @staticmethod def find_all(target, func_condition): """ 查找列表中满足条件的所 ...
- Linux常用服务器搭建
1.Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件 ...
- 微信小程序wx.request请求用POST后台得不到传递数据
微信小程序的wx.request请求,method设为POST并向后台传递数据,但从后台返回的信息来看后台并没有获得传递的数据 wx.request({ url: 'url' ...
- 【安富莱二代示波器教程】第18章 附件C---波形拟合
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=45785 第18章 附件C---波形拟合 emWin5. ...
- [Swift]LeetCode174. 地下城游戏 | Dungeon Game
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- [Swift]LeetCode199. 二叉树的右视图 | Binary Tree Right Side View
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...
- djang-异步——定时操作
django本身是一个同步框架,flask也是,所以要把它变成异步操作的话还得专门设置一下 我的这个系统呢是windows系统,python3.7的 所以有的库是不可以兼容的 ,然后到时候会稍微修改一 ...
- 【spring】静态资源的访问受限解决方法
前言 我们知道在整合spring mvc框架的时候需要在web.xml中配置一个servlet 代码如下 <!--spring mvc 的DispatcherServlet--> < ...
- java线程阻塞唤醒的四种方式
java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...