跳到主要内容

C# 类属性

在C#中,类属性是一种特殊的成员,用于封装类的字段(field)。属性提供了一种灵活的方式来读取、写入或计算私有字段的值,同时还可以在访问或修改数据时添加额外的逻辑。属性是面向对象编程中的重要概念,它们帮助实现数据封装,确保数据的完整性和安全性。

什么是类属性?

类属性是类中的成员,它们看起来像字段,但实际上是通过getset访问器来访问和修改数据的。属性允许你在读取或写入数据时执行额外的逻辑,例如验证输入或触发事件。

属性的基本语法

属性的基本语法如下:

csharp
public class Person
{
private string _name; // 私有字段

// 属性
public string Name
{
get { return _name; }
set { _name = value; }
}
}

在上面的代码中,Name 是一个属性,它封装了私有字段 _nameget 访问器用于返回字段的值,而 set 访问器用于设置字段的值。

自动实现的属性

C# 还支持自动实现的属性,这种属性不需要显式定义私有字段。编译器会自动为你生成一个隐藏的私有字段。

csharp
public class Person
{
public string Name { get; set; } // 自动实现的属性
}

在这个例子中,Name 属性会自动生成一个隐藏的私有字段,并且你可以像访问普通字段一样访问它。

属性的访问器

属性的访问器分为 getset 两种:

  • get 访问器:用于读取属性的值。
  • set 访问器:用于设置属性的值。

只读属性

如果你希望属性只能被读取而不能被修改,可以将 set 访问器设为私有或直接省略 set 访问器。

csharp
public class Person
{
public string Name { get; } // 只读属性
}

只写属性

类似地,如果你希望属性只能被写入而不能被读取,可以将 get 访问器设为私有或直接省略 get 访问器。

csharp
public class Person
{
private string _name;
public string Name { set { _name = value; } } // 只写属性
}

属性的实际应用

属性在实际开发中非常有用,尤其是在需要对数据进行验证或触发某些操作时。以下是一个实际案例,展示了如何使用属性来验证输入数据。

csharp
public class Person
{
private int _age;

public int Age
{
get { return _age; }
set
{
if (value < 0)
{
throw new ArgumentException("年龄不能为负数");
}
_age = value;
}
}
}

在这个例子中,Age 属性在设置时会检查传入的值是否为负数。如果是负数,则会抛出一个异常,从而确保数据的有效性。

属性的高级用法

计算属性

属性不仅可以封装字段,还可以用于计算值。例如,你可以创建一个属性来计算一个人的出生年份。

csharp
public class Person
{
public int Age { get; set; }

public int BirthYear
{
get { return DateTime.Now.Year - Age; }
}
}

在这个例子中,BirthYear 属性会根据 Age 属性的值动态计算出出生年份。

属性与事件

属性还可以与事件结合使用。例如,当属性的值发生变化时,可以触发一个事件。

csharp
public class Person
{
private string _name;

public event EventHandler NameChanged;

public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
NameChanged?.Invoke(this, EventArgs.Empty);
}
}
}
}

在这个例子中,当 Name 属性的值发生变化时,会触发 NameChanged 事件。

总结

C# 中的类属性是封装数据的重要工具。它们不仅可以帮助你控制对类字段的访问,还可以在访问或修改数据时添加额外的逻辑。通过使用属性,你可以确保数据的完整性和安全性,同时还能提高代码的可读性和可维护性。

附加资源

练习

  1. 创建一个 Student 类,包含 NameGrade 属性。确保 Grade 属性的值在 0 到 100 之间。
  2. 修改 Student 类,添加一个 IsPassing 属性,该属性根据 Grade 的值返回 truefalse(假设及格分数为 60 分)。
  3. 创建一个 BankAccount 类,包含 Balance 属性。确保 Balance 属性的值不能为负数。

通过完成这些练习,你将更深入地理解 C# 类属性的使用方法和实际应用场景。