c#3.0系列:Automatic Property
之前的做法:
在c#3.x出来之前,相信大家已经习惯通过一个private field + public property的发式来定义和实现一个public Property。就如下面方式实现。
Automatic Property Overview
在c#3.x出来之后,我们可以通过Automatic Property来简化我们的操作。例如:
Automatic Property IN CLR
首先让我们看看c#3.x出来之前和出来之后,编译器是怎么处理的:

大家可以看到,C#3.x仅仅是基于.NET Programming Language,而不是基于.NET Framework的。加了一些必要的code,使原本我们看起来显得残缺的code(比如缺少对Property 的实现)变得完整。在运行的时候,这些code和原来的code是完全一样的。Automatic Property代码里多处了两个域<Age>k_BackingField和<Name>k_BackingField,他们的作用就是:他们分别对应着两个Property(Age,Name),其作用和person中定义的两个Field(Age,Name)完全一样。代码如下:
internal class Employee
{
// Fields
[CompilerGenerated]
private int <Age>k__BackingField;
[CompilerGenerated]
private string <Name>k__BackingField;

// Methods
public Employee(string name, int age);

// Properties
public int Age { get; private set; }
public string Name { get; set; }
}

Quiz for Automatic Property
注意与抽象属性的区别
abstract class people
{
public abstract string Name { get; set; }
public abstract int Age { get; set; }
}
不能定义只读或者只写的属性,必须同时提供
请看上面Employee。第一行,编译器会报错。
可以给读和写赋予不同的访问权限
请看上面Employee。Age属性,请注意他的操作权限。
自动属性的初始化
动属性会为字段自动赋予变量类型的初始值,如果是引用类型,则为null,如果你想初始化,必须要在
自定义的构造函数初始化。请看上面Employee。
不适用的情况
果想在属性中增加判断、验证等逻辑,则只能用传统的属性定义方法实现 如下:
在c#3.x出来之前,相信大家已经习惯通过一个private field + public property的发式来定义和实现一个public Property。就如下面方式实现。
1
class person
2
{
3
private int age;
4
private string _name;
5
public int Age
6
{
7
get { return age; }
8
set { age = value; }
9
}
10
public string Name
11
{
12
get { return _name; }
13
set { _name = value; }
14
}
15
}
显然你可以在Property中的set/get代码块中,我们可以不受限制地定义我们的业务逻辑,但是在大多是场合下,我们都是像上面的code一样直接对一个定义的field进行操作:对其读写。但是我们如果根据项目的需要,例如作为Business Entity的Class,需要封装非常多的数据,我们需要为不同类型的数据分别定义一个Property,这样不断重复的工作大家一定觉得很厌烦。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

Automatic Property Overview
在c#3.x出来之后,我们可以通过Automatic Property来简化我们的操作。例如:
1
class Employee
2
{
3
//public string Name { get; } error
4
public string Name { get; set; }
5
public int Age{get; private set;}
6
public Employee(string name,int age )
7
{
8
this.Name = name;
9
this.Age = age;
10
}
11
}
上面的好处我就不用说了。
2

3

4

5

6

7

8

9

10

11

Automatic Property IN CLR
首先让我们看看c#3.x出来之前和出来之后,编译器是怎么处理的:
大家可以看到,C#3.x仅仅是基于.NET Programming Language,而不是基于.NET Framework的。加了一些必要的code,使原本我们看起来显得残缺的code(比如缺少对Property 的实现)变得完整。在运行的时候,这些code和原来的code是完全一样的。Automatic Property代码里多处了两个域<Age>k_BackingField和<Name>k_BackingField,他们的作用就是:他们分别对应着两个Property(Age,Name),其作用和person中定义的两个Field(Age,Name)完全一样。代码如下:


















注意与抽象属性的区别





不能定义只读或者只写的属性,必须同时提供
请看上面Employee。第一行,编译器会报错。
可以给读和写赋予不同的访问权限
请看上面Employee。Age属性,请注意他的操作权限。
自动属性的初始化
动属性会为字段自动赋予变量类型的初始值,如果是引用类型,则为null,如果你想初始化,必须要在
自定义的构造函数初始化。请看上面Employee。
不适用的情况
果想在属性中增加判断、验证等逻辑,则只能用传统的属性定义方法实现 如下:
1
public int Age
2
{
3
get { return age; }
4
set
5
{
6
if ((value > 0) && (value < 500))
7
{
8
age = value;
9
}
10
else
11
{
12
throw new ArgumentOutOfRangeException ("你不是人!");
13
}
14
}
15
}
16

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

版权所有归"布衣软件工作者".未经容许不得转载.
分类:
c#3.x学习
, .Net Framework
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述