C# 字段和属性

时间:2024-11-20 07:09:09

在 C# 中,字段和属性是定义类和结构体数据的两种方式。

字段用于直接存储数据,而属性提供了对字段的封装和访问控制

1. 字段(Fields)

定义

字段是类或结构体中用于存储数据的变量。字段可以是任何数据类型,包括基本数据类型、类类型、数组等。字段通常具有访问修饰符,用于控制其可见性。

特点

  • 直接存储数据:字段直接存储数据。
  • 可见性:字段的访问修饰符(如 privatepublicprotected 等)决定了它们的可见性。
  • 不提供封装:字段通常不提供封装,因此可能会直接被访问和修改。
public class Person
{
    // 字段
    private string name;
    private int age;

    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }
}

name 和 age 是 Person 类的字段

2. 属性(Properties)

定义

属性是类或结构体的成员,提供了一种控制对字段访问的方式。属性由 get 和 set 访问器组成,用于读取和写入字段的值。通过属性,可以在访问数据时添加逻辑,例如验证数据或触发事件。

特点

  • 封装:属性提供了对字段的封装,允许在读取和写入数据时执行额外逻辑。
  • 访问控制:可以分别定义 get 和 set 访问器的访问修饰符,以控制对属性的读取和写入权限。
  • 易于维护:使用属性可以使类的内部实现更易于维护和修改,而不影响使用该类的外部代码。
public class Person
{
    //字段
    private string name;
    private int age;

    // 属性
    public string Name
    {
        get { return name; }
        set { name = value; } // 可以添加验证逻辑
    }

    public int Age
    {
        get { return age; }
        set
        {
            if (value < 0) // 验证年龄不能为负数
                throw new ArgumentException("Age cannot be negative.");
            age = value;
        }
    }

    public Person(string name, int age)
    {
        Name = name; // 使用属性赋值
        Age = age;   // 使用属性赋值
    }
}

Name 和 Age 是 Person 类的属性,通过属性可以控制对字段的访问,并在设置年龄时添加了验证逻辑。 

3.字段与属性的比较

特性 字段(Fields) 属性(Properties)
直接存储数据 否(通过访问器间接存储数据)
访问控制 通过访问修饰符 可以分别控制 get 和 set 的访问权限
封装 不提供封装 提供封装,可以添加逻辑
可维护性
语法 直接定义变量 使用 get 和 set 关键字

4. 自动属性 

 C# 还支持自动属性(Auto-Implemented Properties),在不显式定义字段的情况下创建属性。

编译器会自动为你生成一个私有的匿名字段

C# 自动属性-****博客

建议:使用属性而非字段来暴露数据(即字段用private或protected),用来保护字段不被外部非法污染。