在 C# 中,字段和属性是定义类和结构体数据的两种方式。
字段用于直接存储数据,而属性提供了对字段的封装和访问控制。
1. 字段(Fields)
定义
字段是类或结构体中用于存储数据的变量。字段可以是任何数据类型,包括基本数据类型、类类型、数组等。字段通常具有访问修饰符,用于控制其可见性。
特点
- 直接存储数据:字段直接存储数据。
-
可见性:字段的访问修饰符(如
private
、public
、protected
等)决定了它们的可见性。 - 不提供封装:字段通常不提供封装,因此可能会直接被访问和修改。
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),用来保护字段不被外部非法污染。