[C#.NET] 使用 屬性(Property) 的好處

  • 50942
  • 0
  • 2013-07-05

[C#.NET] 使用 屬性(Property) 的好處

我相信很多人寫很久的程式從沒有習慣使用property,甚至連property 是什麼都不知道,長期以來都是一直使用Global parameter,而不知使用property可以更靈活的控制變數,先來介紹一下屬性的結構:請參考屬性 (C# 程式設計手冊)

屬性的寫法如下:
private string _Info = "";
public string Info
{
    get { return this._Info; }
    set { this._Info = value; }
}

屬性有get及set區段,get區段用來回傳給用戶讀取,set是開放給用戶修改,也就是使用value。

而在在.Net 3.0裡可以這樣寫

public string Info { get; set; }

 

好處一:權限控制

public class Class1
{
    private string _Info = "測試資訊";
    public string Info
    {
        get { return this._Info; }
        internal set { this._Info = value; }
    }
}

 

image

這時會有人問,為什麼我要控制變數存取的權限?什麼時候該開放給用戶端(PG)修改?

很簡單,比如說我設計一個類別訪問某個設備,類別有一個變數可以得到設備的軔體版本,這個變數就不可能會由用戶端(PG)修改,用戶端(PG)只會得到(get)訊息,而不可能修改(set)訊息,因為這個訊息是由設備給予的,而不是用戶端。類別有一個變數可以設定IP位址的,用戶端需要傳入IP(set)來設設備,這時就需要修改(set)這個變數。

若是不想給用戶修改其值,在set前面加修釋詞private或internal,代表這個變數只有自己或內部能修改,其他的人不能修改,如此一來便能很輕易的控制變數存取的權限,。

 

好處二:資料綁定

資料綁定的綁定機制是使用類別裡的屬性

[ADO.NET] 類別(Data Transfer Object )與資料繫結

[.NET] 結構 二進位序列化 / 反序列化

 

好處三:行為控制

private string _Name = "余小章";
public string Name
{
    get { return this._Name; }
    set
    {
        if (string.IsNullOrEmpty(value))
            throw new ArgumentNullException("Name");
        this._Name = value;
    }
}

 

試著想想,若是使用全域變數,每個需要用到Name變數處理一次判斷式,不是很累嗎?我們可以在屬性判斷傳入的值是否符合規則、是否要觸發某個事件、執行緒同步等等…。

private string _Name = "余小章";
public string Name
{
    get 
    {
        lock (this._lock)
            return this._Name;  
    }
    set
    {
        lock (this._lock)
        {
            if (string.IsNullOrEmpty(value))
                throw new ArgumentNullException("Name");
            this._Name = value; 
        }
    }
}

 

 


後記:

有天老闆問起為什麼要用屬性,我講了一堆,我想他當時一定聽不懂…於是寫了這篇,也希望能讓其他人也能懂。

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2025 .NET

Image result for microsoft+mvp+logo