(14)C# 基礎—— 字段和屬性

.NET C# Web開發學習之路(14)—— 字段和屬性

字段

字段是一種數據成員,其中容納了一個值類型或者一個引用類型的引用。一般在類的內部做數據交互使用。字段就好比我們的個人所有財產,僅供個人使用,所以一般是private修飾。

屬性

屬性是一種用於訪問對象或類的特性的成員。屬性具有訪問器,這些訪問器指定它們在的值被讀寫時需要執行的語句,因此屬性提供了一種機制,即把讀取和寫入對象的某些特性與一些操作關聯起來。可以像使用公共數據成員一樣使用屬性。

屬性結合了字段和方法的多個方面。對於對象的用戶,顯示爲字段,訪問該屬性仍需要完全相同的語法;對於類的實現者,屬性是一個或兩個代碼塊,表示一個get訪問器和一個set訪問器。讀取時,執行get訪問器的代碼塊;寫入時,執行set訪問器的代碼塊。

    注意:屬性不能作爲ref或out傳遞參數

屬性一般用來在面向對象設計中描述對象的靜態特徵。屬性其實就是外界訪問私有字段的入口,屬性本身不保存任何數據,在對屬性賦值和讀取的時候其實就是操作對應的私有字段。屬性本質是一個方法,通過get和set來操作對應的字段。

屬性的作用

  • 避免出現非法數據,例如一個年齡屬性,正常邏輯年齡是不可以出現負數的,如果用戶對哦年齡進行了負數的賦值,我們溝通過set方法加入判斷邏輯,從而排除這種非法數據。

    private int age;
    public int Age
    {
        get { return age;}
        set
        {
            if(value < 0)
            {
                age = 18;
            }
            else
            {
                age = value;
            }   
        }
    }
    
  • 限定屬性只讀或者只寫。例如有些屬性爲了保護數據,我們只能讀取,不能賦值。具體使用根據需要屏蔽get或者set方法大道只讀或者只寫。

    private const double pi=3.14;
    public double Pi
    {
        get{return pi;}
    }
    
    //
    
    Student s = new Student();
    s.pi = 111;//運行程序,編譯報錯,無法對屬性或索引器pi賦值,它是隻讀的
    

字段與屬性的聯繫

有時候我們會比較矛盾,既然已經有了字段,爲什麼還要用屬性呢?

如果在一個類中,有一個共有字段,那麼在這個類的外部可一隨便訪問和使用這個字段,想怎麼來就怎麼來,一旦這個字段被賦了一個非常離譜的值,那麼對程序可能會造成很大的影響。以前我在寫代碼的時候,沒有注意到這一點,在類中只使用字段,而且還是public修飾的,沒有使用屬性來保護那些本來應該是類的私有的字段。

總結:

  • 屬性對外:暴露數據,數據是可以存儲在字段裏的,也可以是動態計算出來的
  • 對內:保護字段不受“非法值”污染
  • 一般情況下,他們都用於表示實體(對象或者類型)的狀態。
  • 屬性大多數情況下是字段的包裝器

建議:永遠使用屬性,而不是字段來暴露數據,即字段永遠是private或者protected的

自動屬性

編寫屬性的新語法(.NET 3.0 及以後版本)

private int age;
public int Age
{
    get{return age;}
    set{age = value;}
}
可以直接寫成:
public int Age{get;set;}

注意:沒有特定業務邏輯的屬性都可以簡寫成自動屬性,自動屬性的格式不能更改。自動屬性對應的字段由編譯器自動生成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章