C#屬性詳解(c# 通過公共屬性訪問私有成員 優點)

C#屬性是域的擴展(即通常說的成員變量或字段等)它配合C#中的域(字段)使用,使之構造一個安全的應用程序,爲什麼說通過屬性來替代域會提高應用程序的安全呢?

    原因就在於C#屬性通過訪問器(Accessors)用進行數據訪問.所以C#的屬性可以設置爲只讀或只寫. 而字段卻沒有這樣的功能(只可設置只讀).我們都知道在程序中有時我們是不允許用戶修改一些屬性的,比如地球是圓的。原則上我們是不能修改此屬性.那麼我們就可以通過一個屬性來實現這樣的功能.讓它設置爲只讀屬性.

    屬性的特點:C#屬性是對類中的字段(fields)的保護,像訪問字段一樣來訪問屬性。同時也就封裝了類的內部數據。每當賦值運算的時候自動調用set訪問器,其他時候則調用get訪問器。 以 帕斯卡命名 不能冠以Get/Set。靜態屬性是通過類名調用的!

    前面我們說到屬性是字段的擴展,我們都知道如果要在類外部訪問字段,就要公開(Public)這個成員字段。但是如果我們真的這樣做了,那這個成員字段的就可以被任意訪問(包括修改,讀取).那怎麼辦呢? 用一個屬性就可以解決這個問題.

C#屬性是通過Get(讀取)、Set(設置)來訪問屬性的. 
public class Test 

    public Test() 
       { 
              // 
// TODO: 在此處添加構造函數邏輯 
// 
        } 
    //爲了說明問題這裏我們用中文 
    public string 地球的形狀; 

在上面的例子裏"地球的形狀"這個字段就可以任意的訪問,不受任何的束縛.但是我們都知道地球是圓的,是不允許修改的一個特性,那怎麼辦呢?用一個屬性就可以輕鬆的解決這個問題. 
public class Test 

    public Test() 
       {         
              // 
// TODO: 在此處添加構造函數邏輯 
// 
       } 
    //爲了說明問題這裏我們用中文 
    private string 地球的形狀="圓";//私有的成員變量,它對於外部是不可見的. 
    public string 地球形狀 
        { 
           get 
           { 
              return 地球的形狀;//這裏將私有成員變量地球的形狀返回給"地球的形狀" 
           } 
        } 

這裏我們只可以讀取屬性"地球形狀",而不可以寫,如果強制寫編譯器就會提示出錯.這樣我們就可以通過類來訪問屬性. 
Test MyTt=new Test();//實例化類 
string MyTemp=MyTt.地球形狀;//讀取類的屬性 
下面我們說一下寫的應用. 
public class Test 

    public Test() 
       { 
              // 
// TODO: 在此處添加構造函數邏輯 
// 
        } 
    //爲了說明問題這裏我們用中文 
    private string 你的名字;//私有的成員變量,它對於外部是不可見的. 
    public string 名字 
        { 
           get 
           { 
              return 你的名字;//這裏將私有成員變量"你的名字"的形狀返回給"名字" 
           } 
           set 
           { 
               你的名字=value;//這裏的value將等於"名字" 這個屬性值
           } 
        } 

這樣我們就可以對屬性讀取和寫了. 
Test MyTt=new Test();//實例化類 
MyTt.名字="Simon"//設置屬性 
String MyTemp=MyTt.名字;讀取屬性值 
通過上面的例子我們可以看出屬性只不過是做了一箇中介的角色而已,真正工作的還是字段(域),但這樣做可以更面向對象,寫出更安全的應用程序。

     C#提供了一個處理此概念的更清爽的方式。在C#中,get和set方法是內在的,而在Java和C++裏則需人爲維護。C#的處理方式有諸多優點。它鼓勵程序員按照屬性的方式去思考—把這個屬性標爲可讀寫的和只讀的哪個更自然?或者根本不應該爲屬性?如果你想改變你的屬性的名稱,你只要檢查一處就可以了。

    C#中屬性這種機制使得在保證封裝性的基礎上實現了訪問私有成員的便捷性。一個支持屬性的語言將有助於獲得更好的抽象。

    來自MSDN中的內容:

屬性和屬性過程

    可以使用屬性和字段在對象中存儲信息。屬性使用屬性過程控制如何設置或返回值,而字段只是公共變量。屬性過程是在屬性定義中聲明的代碼塊,可用於在設置或檢索屬性值時執行代碼。

    具有兩種類型的屬性過程:用於檢索屬性值的 Get 屬性過程和用於爲屬性分配值的 Set 屬性過程。例如,存儲銀行帳戶餘額的屬性可能會在 Get 屬性過程中使用代碼以在返回可用餘額之前記入利息並檢查服務費。然後,您可以使用 Set 屬性過程驗證餘額並防止它以不正確的方式更新。簡而言之,屬性過程允許對象保護和驗證自己的數據。

只讀和只寫屬性
    大多數屬性都具有 Get 和 Set 屬性過程,這兩個屬性過程可用於讀取和修改存儲在內部的值。然而,您可以使用 ReadOnly 或 WriteOnly 修飾符來限制對屬性進行修改或讀取。

    只讀屬性不能具有 Set 屬性過程。這種屬性用於需要公開但不允許修改的項。例如,可以使用只讀屬性來提供計算機處理器的速度。

    只寫屬性不能具有 Get 屬性過程,它們用於使用不應或不能存儲在對象中的數據配置對象。例如,只寫屬性可用於獲取密碼並在不存儲該密碼的情況下更改對象的狀態。



轉自:deepwishly

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