程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> c#3.0系列:Automatic Property

c#3.0系列:Automatic Property

編輯:關於C#

之前的做法:

在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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved