C# 属性(Property)


C# 属性(Property)

在C#中,属性(Property)是一种特殊的类成员,用于提供对类私有字段(Private Field)的访问器(Accessor)。可以将属性看作是访问或修改类成员变量的方法,保证数据的可控性和安全性。

类型(Type)的属性由get、set访问器提供。get访问器提供属性值,set访问器对属性进行设置或修改操作。由于属性的访问器相当于方法,因此访问器可以包含可执行的代码来过滤、适当格式化输入或输出数据、触发事件、验证数据等操作,为属性的访问增加了灵活性和扩展性。属性也可以定义为只读(Read-only)或只写(Write-only)的。

我们通常使用自动实现属性(Automatic Property)和完全属性(Full Property)在类中定义属性以及访问器。在实现属性时,需要使用get和set关键字来为属性提供访问器,格式如下:

public [访问控制符] [数据类型] [属性名]
{
    get
    {
        [get访问器的代码];
    }
    set
    {
        [set访问器的代码];
    }
}

其中,[访问控制符]表示了该属性的安全等级,只有定义了属性的类和派生类才能访问;[数据类型]表示了属性值的数据类型;[属性名]是属性的名称,根据C#的命名规则为PascalCase。

自动实现属性

自动实现属性是最常见的实现属性的方法之一。自动实现属性不需要使用任何字段,但要求数据类型在装配时必须指定。一个简单的自动实现属性如下所示。

public string Name { get; set; }

该属性名称为Name,其类型为string,可同时具有读取和设置有效属性值的get和set访问器。在使用这种属性时,只需要使用实例.Name即可。在访问属性时,自动实现属性会自动提供一个默认的实例字段来存储数据。

Person p = new Person();
p.Name = "John";
Console.WriteLine(p.Name); // 输出John

注意:当使用自动实现属性时,我们无法通过编程方式访问该属性的后备字段。

完全属性

完全属性的格式与自动实现属性的格式相同,但使用了私有字段(Private Field)来存储数据。这种属性需要提供get和set访问器,在设置和获取属性值时使用私有字段。

例如,我们构造一个保存Person对象地址的Address类。这个类的完全属性如下所示。

class Address
{
    private string streetName;
    private int houseNum;
    private string zipCode;
    private string state;

    public string StreetName
    {
        get { return streetName; }
        set { streetName = value; }
    }

    public int HouseNum
    {
        get { return houseNum; }
        set { houseNum = value; }
    }

    public string ZipCode
    {
        get { return zipCode; }
        set { zipCode = value; }
    }

    public string State
    {
        get { return state; }
        set { state = value; }
    }
}

在上面的代码中,get访问器返回了相应的私有字段,set访问器将value设置为私有字段的值。

属性的用途

属性可以用于对类成员变量的访问限制和封装。同时也可以在属性访问器中增加控制和校验代码,确保只有有限的数据被修改和调用。在属性概念的推动下,C#中的LINQ和Entity Framework都大量使用属性处理。您可以使用属性在实例中简化代码调用,并在代码中实现更简单的逻辑。

总之,在C#中,属性是一种对类的成员变量进行控制访问的重要方式,允许将读写控制、验证、错误处理、封装和隐藏操作绑定在数据访问操作上。