📅  最后修改于: 2023-12-03 15:00:14.168000             🧑  作者: Mango
在C# 3.0中,引入了自动属性使属性的声明更加简洁,编写更加容易。自动属性是一种特殊的属性,其getter和setter方法由编译器自动生成。
声明自动属性时,只需在属性前加上public
、private
、internal
等访问限定符,并指定属性的类型和名字即可。例如:
public string Name { get; set; }
这就声明了一个具有公共getter
和公共setter
的字符串属性Name
。 在此示例中,自动生成的代码将使用类级私有成员来存储属性的值。使用自动属性时,我们无需为存储属性值而使用另一个变量。
在C# 3.0之前,要在类中定义一个属性并设置初始值,需要编写带有私有字段的显式属性,并在属性初始化程序中将私有字段重置为新值。但在C# 3.0中,我们可以为自动属性提供一个初始值:
public int Age { get; set; } = 18;
这样可以将自动属性的初始值设置为18,而不需要显式字段。
我们可以根据需要选择自动属性的访问级别,一如既往的通过在属性前添加关键字 public、private、protected 或 internal 来设置自动属性的访问级别:
public string Name { get; set; }
private int Age { get; set; } = 18;
默认情况下,自动属性既具有getter
,也具有setter
。 在某些情况下,诸如只读属性之类的需求。 使用自动实现属性的技巧之一是通过省略set
访问器将其更改为只读属性:
public string Name { get; }
但是,如果我们指定只读getter
并在实例化后设置类的属性,我们将无法在外部更改属性的值。 这是因为生成的只读属性没有setter
方法:
var person = new Person();
person.Name = "John"; // Compile error
默认情况下,自动实现属性的getter和setter方法使用私有字段来检索和修改属性的值。 如果您需要使用不同的位置存储属性值,可以在自动属性中使用getter
和setter
方法来实现自定义行为。
例如,如果我们想要在将年龄属性设置为负数时引发异常,我们可以编写以下代码:
private int _age;
public int Age
{
get => _age;
set
{
if (value < 0)
{
throw new ArgumentException("Age cannot be negative");
}
_age = value;
}
}
这里我们用if
语句检查设置的值是否为负数。如果是负数,我们抛出一个ArgumentException
来通知用户,并停止设置年龄属性的值。
使用自动属性可以使C#代码更加简洁易懂。不需要编写过多的存储和检索属性值的代码。此外,自动属性还可以设置初始值,指定访问级别和仅可读或仅可写。最后,自己的getter
和setter
方法可以自定义自动属性的行为。