回覆列表
  • 1 # 錢布斯

    屬性的訪問器包含與獲取(讀取或計算)或設定(寫)屬性有關的可執行語句。訪問器宣告可以包含 get 訪問器或 set 訪問器,或者兩者均包含。宣告採用下列形式之一:

    get {}

    set {}

    get 訪問器

    get 訪問器體與方法體相似。它必須返回屬性型別的值。執行 get 訪問器相當於讀取欄位的值。以下是返回私有欄位 name 的值的 get 訪問器:

    private string name; // the name field

    public string Name // the Name property

    {

    get

    {

    return name;

    }

    }

    當引用屬性時,除非該屬性為賦值目標,否則將呼叫 get 訪問器讀取該屬性的值。例如:

    Employee e1 = new Employee();

    ...

    Console.Write(e1.Name); // The get accessor is invoked here

    get 訪問器必須在 return 或 throw 語句中終止,並且控制不能超出訪問器體。

    set 訪問器

    set 訪問器與返回 void 的方法類似。它使用稱為 value 的隱式引數,此引數的型別是屬性的型別。在下例中,set 訪問器被新增到 Name 屬性:

    public string Name

    {

    get

    {

    return name;

    }

    set

    {

    name = value;

    }

    }

    當對屬性賦值時,用提供新值的引數呼叫 set 訪問器。例如:

    e1.Name = "Joe"; // The set accessor is invoked here

    在 set 訪問器中對區域性變數宣告使用隱式引數名 (value) 是錯誤的。

    備註

    屬性按如下方式,根據所使用的訪問器進行分類:

    只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。

    只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。

    同時帶有 get 和 set 訪問器的屬性為讀寫屬性。

    在屬性宣告中,get 和 set 訪問器都必須在屬性體的內部宣告。

    使用 get 訪問器更改物件的狀態是一種錯誤的程式設計樣式。例如,以下訪問器在每次訪問 number 欄位時都產生更改物件狀態的副作用。

    public int Number

    {

    get

    {

    return number++; // Don"t do this

    }

    }

    可以將 get 訪問器用於返回欄位值,或用於計算欄位值並將其返回。例如:

    public string Name

    {

    get

    {

    return name != null ? name : "NA";

    }

    }

    在上述程式碼段中,如果不對 Name 屬性賦值,它將返回值 NA。

    示例 1

    此例說明如何訪問基類中被派生類中具有同一名稱的另一個屬性隱藏的屬性。

    // property_hiding.cs

    // Property hiding

    using System;

    public class BaseClass

    {

    private string name;

    public string Name

    {

    get

    {

    return name;

    }

    set

    {

    name = value;

    }

    }

    }

    public class DerivedClass : BaseClass

    {

    private string name;

    public new string Name // Notice the use of the new modifier

    {

    get

    {

    return name;

    }

    set

    {

    name = value;

    }

    }

    }

    public class MainClass

    {

    public static void Main()

    {

    DerivedClass d1 = new DerivedClass();

    d1.Name = "John"; // Derived class property

    Console.WriteLine("Name in the derived class is: {0}",d1.Name);

    ((BaseClass)d1).Name = "Mary"; // Base class property

    Console.WriteLine("Name in the base class is: {0}",

    ((BaseClass)d1).Name);

    }

    }

    輸出

    Name in the derived class is: John

    Name in the base class is: Mary

    以下是上例中顯示的重點:

    派生類中的屬性 Name 隱藏基類中的屬性 Name。在這種情況下,派生類的該屬性宣告使用 new 修飾符:

    public new string Name

    {

    ...

    轉換 (BaseClass) 用於訪問基類中的隱藏屬性:

    ((BaseClass)d1).Name = "Mary";

  • 中秋節和大豐收的關聯?
  • 書畫大師董其昌為何被抄家?