如何声明和使用读/写属性(C# 编程指南)

属性提供了公共数据成员的便利性,且不会产生未受保护、不可控制和未经验证地访问对象的数据的风险。 属性声明访问器:从基础数据成员中赋值和检索值的特殊方法。 set 访问器可分配数据成员,get 访问器检索数据成员值。

此示例演示具有两个属性的 Person 类:Name(字符串)和 Age(整型)。 这两个属性均提供 getset 访问器,因此它们被视为读/写属性。

示例

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;
    }
}

public class Wrapper
{
    private string _name = "N/A";
    public string Name
    {
        get
        {
            return _name;
        }
        private set
        {
            _name = value;
        }
    }

}

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
*/

可靠编程

在前面的示例中,NameAge 属性为 public,同时包含 getset 访问器。 公共访问器使得任何对象均可读取和写入这些属性。 但是,有时需要排除其中的一个访问器。 可以省略 set 访问器以使属性为只读:

public string Name
{
    get
    {
        return _name;
    }
    private set
    {
        _name = value;
    }
}

或者,可以公开一个访问器,但使另一个访问器为私有或受保护。 有关详细信息,请参阅非对称性访问器可访问性

声明属性后,便可将这些属性用作类的字段。 在获取和设置属性的值时,属性允许一种自然的语法,如以下语句所示:

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

在属性 set 方法中,特殊的 value 变量为可用。 此变量包含用户指定的值,例如:

_name = value;

请注意在 Person 对象上递增 Age 属性的简洁语法:

person.Age += 1;

如果将单独的 setget 方法用于模型属性,则等效的代码可能如下所示:

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

ToString 方法在此示例中被重写:

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

请注意,ToString 未显式用于程序中。 默认情况下,通过 WriteLine 调用对其进行调用。

请参阅