📜  C#3.0 自动属性(auto implemented properties)(1)

📅  最后修改于: 2023-12-03 15:00:14.168000             🧑  作者: Mango

C# 3.0 自动属性 (Auto-Implemented Properties)

在C# 3.0中,引入了自动属性使属性的声明更加简洁,编写更加容易。自动属性是一种特殊的属性,其getter和setter方法由编译器自动生成。

声明自动属性

声明自动属性时,只需在属性前加上publicprivateinternal等访问限定符,并指定属性的类型和名字即可。例如:

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方法使用私有字段来检索和修改属性的值。 如果您需要使用不同的位置存储属性值,可以在自动属性中使用gettersetter方法来实现自定义行为。

例如,如果我们想要在将年龄属性设置为负数时引发异常,我们可以编写以下代码:

private int _age;
public int Age
{
    get => _age;
    set
    {
        if (value < 0)
        {
            throw new ArgumentException("Age cannot be negative");
        }
        _age = value;
    }
}

这里我们用if语句检查设置的值是否为负数。如果是负数,我们抛出一个ArgumentException来通知用户,并停止设置年龄属性的值。

总结

使用自动属性可以使C#代码更加简洁易懂。不需要编写过多的存储和检索属性值的代码。此外,自动属性还可以设置初始值,指定访问级别和仅可读或仅可写。最后,自己的gettersetter方法可以自定义自动属性的行为。