如何声明和使用读/写属性(C# 编程指南)
属性提供了公共数据成员的便利性,且不会产生未受保护、不可控制和未经验证地访问对象的数据的风险。 属性声明访问器:从基础数据成员中赋值和检索值的特殊方法。 set 访问器可分配数据成员,get 访问器检索数据成员值。
此示例演示具有两个属性的 Person
类:Name
(字符串)和 Age
(整型)。 这两个属性均提供 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;
}
}
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
*/
可靠编程
在前面的示例中,Name
和 Age
属性为 public,同时包含 get
和 set
访问器。 公共访问器使得任何对象均可读取和写入这些属性。 但是,有时需要排除其中的一个访问器。 可以省略 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;
如果将单独的 set
和 get
方法用于模型属性,则等效的代码可能如下所示:
person.SetAge(person.GetAge() + 1);
ToString
方法在此示例中被重写:
public override string ToString()
{
return "Name = " + Name + ", Age = " + Age;
}
请注意,ToString
未显式用于程序中。 默认情况下,通过 WriteLine
调用对其进行调用。