Programming C#.Classes and Objects.屬性

來源:互聯網
上載者:User

標籤:des   style   blog   http   io   color   ar   os   使用   

屬性是這樣的成員:它提供靈活的機制來讀取、編寫或計算某個私人欄位的值。 可以像使用公用資料成員一樣使用屬性,但實際上它們是稱作“訪問器”的特殊方法。 這使得可以輕鬆訪問資料,此外還有助於提高方法的安全性和靈活性。

意思是如果我們想封裝類的成員變數,但是我們總不能把所有的變數都封裝的死死的,不允許外面的任何人看到,這是不合理的。

例如有一個person類,它的屬性有姓名、性別、年齡等。我要訪問某個對象的性別,或者設定某個對象的性別。

外部的對象要實現,對它的訪問,有三種方法:

1.把屬性改正public的許可權,這樣任何人都能看到或者修改這個屬性,這樣很簡潔,但是出現的問題是安全性降低,比如我對這個欄位賦值“牛”,那麼這個對象的的性別欄位就是“牛”了,顯然不合理。

2.仍然保持欄位的private私人屬性,編寫一個方法實現欄位的修改,但是這樣以來,外部對象訪問內部私人對象的時候,很麻煩,必須調用set()或者get()方法。那麼就尋求一種方法,能不公開私人欄位,同時又能很簡潔的調用,就好像是在直接存取成員欄位一樣,所以就引入了第三種方法:屬性。

3.屬性封裝欄位資料,對象的欄位保持其private的存取權限,利用屬性實現封裝,好像直接存取成員欄位一樣供外部對象使用。但是本質上仍然是通過類的成員方法訪問才實現的。屬性也是類的成員,但是它是私人地段的封裝,只是私人欄位的一個對外的介面,它能通過一些邏輯保證私人欄位訪問的安全機制,同時又不會像第2種方法那樣使用使用者不友好的介面。能想直接存取私人欄位一樣訪問。

在本樣本中,TimePeriod 類儲存一個時間段。 在內部,類以秒為單位儲存時間,但用戶端使用名為 Hours 的屬性能夠以小時為單位指定時間。 Hours 屬性的訪問器執行小時和秒之間的轉換。

 1 class TimePeriod 2 { 3     private double seconds; 4  5     public double Hours 6     { 7         get { return seconds / 3600; } 8         set { seconds = value * 3600; } 9     }10 }11 12 13 class Program14 {15     static void Main()16     {17         TimePeriod t = new TimePeriod();18 19         // Assigning the Hours property causes the ‘set‘ accessor to be called.20         t.Hours = 24;21 22         // Evaluating the Hours property causes the ‘get‘ accessor to be called.23         System.Console.WriteLine("Time in hours: " + t.Hours);24     }25 }26 // Output: Time in hours: 24
View Code

 value 關鍵字用於定義由 set 存取子分配的值。

我們可以設定存取修飾詞限制get和set方法的存取權限,為此,屬性必須既有set又有get存取方法,而且只能限制其中之一,修飾符必須必屬性本身已有的存取權限要嚴格。

此樣本示範如何建立一個不可變輕量類,用於僅封裝一組自動實作屬性。 當您必須使用參考型別語義時,請使用此種構造而不是結構。

請注意:對於自動實作屬性,需要 get 和 set 訪問器。 要使該類不可變,請將 set 訪問器聲明為 private。 但是,聲明私人 set 訪問器時,不能使用對象初始值來初始化屬性。 必須使用建構函式或Factory 方法。

 1  // This class is immutable. After an object is created, 2     // it cannot be modified from outside the class. It uses a 3     // constructor to initialize its properties. 4     class Contact 5     { 6         // Read-only properties. 7         public string Name { get; private set; } 8         public string Address { get; private set; } 9 10         // Public constructor.11         public Contact(string contactName, string contactAddress)12         {13             Name = contactName;14             Address = contactAddress;               15         }16     }17 18     // This class is immutable. After an object is created,19     // it cannot be modified from outside the class. It uses a20     // static method and private constructor to initialize its properties.   21     public class Contact222     {23         // Read-only properties.24         public string Name { get; private set; }25         public string Address { get; private set; }26 27         // Private constructor.28         private Contact2(string contactName, string contactAddress)29         {30             Name = contactName;31             Address = contactAddress;               32         }33 34         // Public factory method.35         public static Contact2 CreateContact(string name, string address)36         {37             return new Contact2(name, address);38         }39     }
View Code

 前面說了,屬性只是封裝資料欄位,編譯器為每個自動實作屬性建立了後備欄位 這些欄位無法直接從原始碼進行訪問。

Programming C#.Classes and Objects.屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.