改善 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. Deepin下配置JDK8

    下载JDK 首先在http://www.oracle.com/technetwork/java/javase/downloads/index.html下载对应的JDK 本人下载的是JDK8 解压tar ...

  2. WPF:How to display a Bitmap on Image control

    一个Bitmap文件,叫做screenShotFile, 你可以这样显示到Image控件上. BitmapImage bi = new BitmapImage();            bi.Beg ...

  3. MongoDB 错误汇总

    错误1. ERROR: child process failed, exited with error number 100 可能原因: 1.没有正确关闭服务 2.服务已经启动 3.conf文件的参数 ...

  4. 高效求a的n次幂的算法

    代码: public class A的N次幂 { public static void main(String[] args) { int a = 2; int n = 60; long t = Sy ...

  5. [SQL]LeetCode197. 上升的温度 | Rising Temperature

    SQL架构 Create table If Not Exists Weather (Id int, RecordDate date, Temperature int) Truncate table W ...

  6. [Swift]LeetCode870. 优势洗牌 | Advantage Shuffle

    Given two arrays A and B of equal size, the advantage of A with respect to B is the number of indice ...

  7. [Swift]LeetCode1027. 最长等差数列 | Longest Arithmetic Sequence

    Given an array A of integers, return the length of the longest arithmetic subsequence in A. Recall t ...

  8. Truncated incorrect DOUBLE value: 'd'的解决方法(jdbc)

    今天写jdbc中dao的增删改查时遇到了一个问题,花费了好长时间,不过还好,有我峰哥出头,问题解决了,在这做个分享,对峰哥表达一下感激之情 网上搜索到的对“Truncated incorrect DO ...

  9. Python Django(WEB电商项目构建)

    (坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...

  10. 【Spark篇】---SparkSQL中自定义UDF和UDAF,开窗函数的应用

    一.前述 SparkSQL中的UDF相当于是1进1出,UDAF相当于是多进一出,类似于聚合函数. 开窗函数一般分组取topn时常用. 二.UDF和UDAF函数 1.UDF函数 java代码: Spar ...