属性

属性可以对设值、取值的过程进行非法值控制,比如除数禁止为0,而字段则不能进行这样的设置。虽然一般情况下get读取的值就是set设置的值,但也有极端的例子

Eg1:(让get读取的值不是set设置的值)

 1     class Program
2 {
3 static void Main(string[] args)
4 {
5 Person p = new Person();
6 p.Age = 25;
7 p.Age++;
8 Console.WriteLine(p.Age);//输出为10
9

10 Console.ReadKey();
11 }
12
13 }
14 class Person
15 {
16 public int Age
17 {
18 get
19 {
20 return 10;
21 }
22 set
23 {
24
25 }
26 }
27 }

Eg2:进行非法值控制

 1         class Person
2 {
3 private string job;
4 public string Job
5 {
6 get
7 {
8 return job;
9 }
10 set
11 {
12 if (value == "Waiter")
13 {
14 this.job = "工资太少,不干!";
15 return;
16 }
17 this.job = value; ;
18 }
19 }
20 }

Eg3:

1 public int Age
2 {
3 get;
4 set;
5 }

若用Reflector反编译 Eg3 可以看出其属性内部就是两个方法:

 1 [CompilerGenerated]
2 public void set_Age(int value)
3 {
4 this.<Age>k__BackingField = value;
5 }
6
7 public int get_Age()
8 {
9 return this.<Age>k__BackingField;
10 }

这就是编译器玩的技巧,.NET中的“语法糖”(非官方定义),当程序员简单的get、set的时候编译器自动帮程序员生成私有字段:

private int <Age>k__BackingField;

并且帮我们完成这两个方法,微软真是太伟大啊!(泪流满面)而且
其声明的属性名很有意思微软凭借其编译器的内部优势生成了一个看似违反微软自己语法的属性名

<Age>k__BackingField;

我们知道一般声明字段用"_"或者字母开头,但微软的编译器有这个特权改字段的名字,真是“只许州官放火不许百姓点灯”,无非是让程序员用起来更方便。

原文地址:https://www.cnblogs.com/assur/p/2232191.html