VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • c#3.0系列Automatic prorerty

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  之前的做法:

  在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 Entity的Class,需要封装非常多的数据,我们需要为不同类型的数据分别定义一个Property,这样不断重复的工作大家一定觉得很厌烦。

  Automatic Property Overview

  在c#3.x出来之后,我们可以通过Automatic Property来简化我们的操作。例如:

1class 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  }

  上面的好处我就不用说了。

  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。

  不适用的情况

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

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



相关教程