標籤: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: 24View 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.屬性