惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
博客园 - 司徒正美
博客园_首页
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
I
InfoQ
M
MIT News - Artificial intelligence
T
Tailwind CSS Blog
L
LangChain Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
B
Blog
博客园 - 叶小钗
雷峰网
雷峰网
H
Help Net Security
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - gjcn

2011,美好生活的一年 8万亿 全球第二还是最二? CLR系列:浅析委托 CLR系列:浅析.NET的JIT编译 CLR系列:浅析泛型的本质 Linq系列:基础与本质(Part III) Linq系列:基础与本质(Part II) Linq系列:基础与本质(Part I) CLR系列:由一段代码所想到的 {Agile},{CMMI},现状 CLR系列:大型对象堆 CLR系列:窥视HashTable c#3.0系列:Object Initializer 和 Collection Initializer c#3.0系列:Extension Method c#3.0系列:Anonymous Type In CLR(3.5) - gjcn Quiz:who win in finally vs return? Inside C#(一些内部实现的东西) Multi-Language of web application project ASP.NET应用程序的文件组成及编译过程
c#3.0系列:Automatic Property
gjcn · 2008-04-10 · via 博客园 - gjcn

之前的做法:
在c#3.x出来之前,相信大家已经习惯通过一个private field + public property的发式来定义和实现一个public Property。就如下面方式实现。

 1class 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 EntityClass,需要封装非常多的数据,我们需要为不同类型的数据分别定义一个Property,这样不断重复的工作大家一定觉得很厌烦。
Automatic Property Overview
在c#3.x出来之后,我们可以通过Automatic Property来简化我们的操作。例如:

 1class Employee
 2    {
 3        //public string Name { get; }  error
 4        public string Name getset; }
 5        public int  Age{getprivate set;}
 6        public Employee(string name,int age )
 7        {
 8            this.Name = name;
 9            this.Age = age;
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,他们的作用就是:他们分别对应着两个PropertyAgeName),其作用和person中定义的两个FieldAgeName)完全一样。代码如下:

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 {  getprivate set; }
    
public string Name get;  set; }
}


 

Quiz for Automatic Property
注意与抽象属性的区别

abstract class people
    
{
        
public abstract string Name getset; }
        
public abstract int Age getset; }
    }

不能定义只读或者只写的属性,必须同时提供
请看上面Employee。第一行,编译器会报错。

可以给读和写赋予不同的访问权限
请看上面

Employee。Age属性,请注意他的操作权限。

自动属性的初始化
动属性会为字段自动赋予变量类型的初始值,如果是引用类型,则为null,如果你想初始化,必须要在
自定义的构造函数初始化。请看上面

Employee

不适用的情况
果想在属性中增加判断、验证等逻辑,则只能用传统的属性定义方法实现 如下:

 1public 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

版权所有归"布衣软件工作者".未经容许不得转载.