共用方式為


HOW TO:宣告和使用讀取/寫入屬性 (C# 程式設計手冊)

更新:2007 年 11 月

屬性提供公用資料成員的便利,同時免除了未受保護、未受控制和未經驗證即存取物件資料帶來的風險。這是因為有「存取子」(Accessor) 的關係:這是一種特殊方法,用來指派及擷取基礎資料成員的值。set 存取子可讓資料成員獲得指派,而 get 存取子則會擷取資料成員值。

在下面的範例中,Person 類別有兩個屬性,分別是 Name (string) 和 Age (int)。兩個屬性都提供了 get 和 set 存取子,所以被視為讀取/寫入屬性。

範例

class Person
{
    private string name = "N/A";
    private int age = 0;

    // Declare a Name property of type string:
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

    // Declare an Age property of type int:
    public int Age
    {
        get
        {
            return age;
        }

        set
        {
            age = value;
        }
    }

    public override string ToString()
    {
        return "Name = " + Name + ", Age = " + Age;
    }
}

class TestPerson
{
    static void Main()
    {
        // Create a new Person object:
        Person person = new Person();

        // Print out the name and the age associated with the person:
        Console.WriteLine("Person details - {0}", person);

        // Set some values on the person object:
        person.Name = "Joe";
        person.Age = 99;
        Console.WriteLine("Person details - {0}", person);

        // Increment the Age property:
        person.Age += 1;
        Console.WriteLine("Person details - {0}", person);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Person details - Name = N/A, Age = 0
    Person details - Name = Joe, Age = 99
    Person details - Name = Joe, Age = 100
*/

穩固程式設計

在先前的範例中,Name 和 Age 屬性為 public,且同時包含 get 和 set 存取子。這可讓任何物件讀取和寫入這些屬性。然而,有時候最好排除其中一個存取子。例如,省略 set 存取子,讓屬性成為唯讀:

public string Name
{
    get
    {
        return name;
    }
}

或者,您可以將其中一個存取子公開為公用,但讓另一個成為私用或保護的。如需詳細資訊,請參閱非對稱存取子存取範圍

屬性一經宣告,它們可以用於做為是否為類別的欄位。當同時取得和設定屬性值時,此允許一個非常自然的語法,如下列陳述式所示:

person.Name = "Joe";
person.Age = 99;

請注意,屬性的 set 方法可以使用特殊的 value 變數。例如,這個變數包含使用者指定的數值:

name = value;

注意 Person 物件中遞增 Age 屬性的簡潔語法:

person.Age += 1;

如果個別的 set 和 get 方法用於建構屬性,那麼作用相當的程式碼可能會看起來像這樣:

person.SetAge(person.GetAge() + 1); 

這個範例會覆寫 ToString 方法:

public override string ToString()
{
    return "Name = " + Name + ", Age = " + Age;
}

請注意,程式中並不是明確使用 ToString,而是預設會由 WriteLine 呼叫來叫用。

請參閱

概念

C# 程式設計手冊

參考

屬性 (C# 程式設計手冊)

類別和結構 (C# 程式設計手冊)