改善 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# 的语言习惯(一) - 使用属性而不是可访问的数据成员(整理中)的更多相关文章

  1. 《Effective C#》读书笔记-1.C# 语言习惯-1.使用属性而不是可访问的数据成员

    思维导图: 大纲: 1.使用属性而不是可访问的数据成员    属性        指定不同的访问权限        隐式属性降低了声明属性的工作量        允许将数据成员作为公共接口的一部分暴露 ...

  2. 《C#高效编程》读书笔记01-使用属性而不是可访问的数据成员

    在需求变更中,属性比数据成员更容易修改,例:客户对象不该与空白名称,若你使用公有属性封装Name,那么现在修改一处,而数据成员则可能要修改多处 public class Customer { priv ...

  3. [.NET] 《C# 高效编程》(一) - C# 语言习惯

    C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Con ...

  4. [.NET] 《Effective C#》快速笔记(一)- C# 语言习惯

    <Effective C#>快速笔记(一)- C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 ...

  5. 《Effective C#》快速笔记(一)- C# 语言习惯

    目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Conditional ...

  6. C# 语言习惯

    目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 is 或 as 操作符而不是强制类型转换 四.使用 Conditional ...

  7. C语言关键字register、extern、static、一些总结,及项目中使用的心得

    首先介绍两个概念: 一.变量的生存周期: 变量从建立到撤销的时间段成变量的生存周期.静态变量,从变量产生到整个程序执行结束.当函数使用变量结束后,变量的存储空间依然存在,变量的值也会随着函数的对其的使 ...

  8. Swift2.0语言教程之类的属性

    Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...

  9. Xamarin XAML语言教程使用Progress属性数据绑定设置进度条进度

    Xamarin XAML语言教程使用Progress属性数据绑定设置进度条进度 开发者除了可以为ProgressBar定义的Progress属性直接赋双精度类型的值外,还可以通过数据绑定的方式为该属性 ...

随机推荐

  1. LeetCode 33 Search in Rotated Sorted Array [binary search] <c++>

    LeetCode 33 Search in Rotated Sorted Array [binary search] <c++> 给出排序好的一维无重复元素的数组,随机取一个位置断开,把前 ...

  2. c++ 读取不了hdf5文件中的字符串

    问题描述: 在拿到一个hdf5文件,想用c++去读取文件中的字符串,但是会报错:read failed ps: c++读取hdf5的字符串方法见:https://support.hdfgroup.or ...

  3. Luogu P1894 [USACO4.2]The Perfect Stall

    传送门 是道绿题???二分图(网络流)不应该是蓝打底??? 这题浏览一遍就知道是二分图(网络流)算法喽,二分图代码太短,不想写(←这人???),所以就拿网络流练练手. 设源点S=0,汇点T=n+m+1 ...

  4. Edge Intelligence: On-Demand Deep Learning Model Co-Inference with Device-Edge Synergy

    边缘智能:按需深度学习模型和设备边缘协同的共同推理 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文. ...

  5. 【安富莱专题教程第3期】开发板搭建Web服务器,利用花生壳让电脑和手机可以外网远程监控

    说明:1.  开发板Web服务器的设计可以看我们之前发布的史诗级网络教程:链接.2.  需要复杂些的Web设计模板,可以使用我们V6开发板发布的综合Demo:链接.3.  教程中使用的是花生壳免费版, ...

  6. [Swift]LeetCode202. 快乐数 | Happy Number

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  7. [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence

    We define a harmonious array is an array where the difference between its maximum value and its mini ...

  8. Java-SSM框架页面时间格式转换

    在JSP中,列表查询绑定时间时,会出现以下的时间格式,那样看起来的话,感觉... 那如何转换成“yyyy-MM-dd HH:mm:ss”格式呢?--很简单,在JSP头顶加上 <%@ taglib ...

  9. Python内置函数(4)——ascii

    英文文档: ascii(object) As repr(), return a string containing a printable representation of an object, b ...

  10. xtrabackup备份

    增量备份: xtrabackup --backup --target-dir=/data/backup/base --datadir=/var/lib/mysql xtrabackup --backu ...