跳到主要内容

C# 属性访问器

介绍

在C#中,属性(Property)是一种特殊的类成员,它允许我们以更灵活的方式访问和修改类的私有字段。属性通常由两个访问器组成:getsetget 访问器用于读取属性的值,而 set 访问器用于设置属性的值。通过使用属性访问器,我们可以在访问或修改字段时添加额外的逻辑,例如验证或计算。

基本语法

一个典型的C#属性定义如下:

csharp
public class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
}

在这个例子中,Name 是一个属性,它封装了私有字段 nameget 访问器返回 name 的值,而 set 访问器将传入的值赋给 name

自动实现的属性

C#还支持自动实现的属性,这样可以简化代码。自动实现的属性不需要显式定义私有字段,编译器会自动生成一个隐藏的字段。

csharp
public class Person
{
public string Name { get; set; }
}

在这个例子中,Name 属性会自动生成一个隐藏的私有字段,并且 getset 访问器的逻辑也是自动生成的。

只读和只写属性

我们可以通过省略 setget 访问器来创建只读或只写属性。

只读属性

csharp
public class Person
{
private string name = "John";

public string Name
{
get { return name; }
}
}

在这个例子中,Name 是一个只读属性,因为它只有 get 访问器,没有 set 访问器。

只写属性

csharp
public class Person
{
private string name;

public string Name
{
set { name = value; }
}
}

在这个例子中,Name 是一个只写属性,因为它只有 set 访问器,没有 get 访问器。

访问器中的逻辑

属性访问器不仅可以简单地读取或设置字段的值,还可以包含额外的逻辑。例如,我们可以在 set 访问器中添加验证逻辑。

csharp
public class Person
{
private int age;

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

在这个例子中,Age 属性的 set 访问器会检查传入的值是否为负数。如果是负数,则会抛出一个异常。

实际应用场景

数据验证

属性访问器常用于数据验证。例如,在用户注册时,我们可以使用属性访问器来确保用户输入的年龄是有效的。

csharp
public class User
{
private int age;

public int Age
{
get { return age; }
set
{
if (value < 0 || value > 120)
{
throw new ArgumentException("Invalid age");
}
age = value;
}
}
}

计算属性

属性访问器还可以用于计算属性。例如,我们可以创建一个属性来计算一个人的出生年份。

csharp
public class Person
{
private int age;

public int Age
{
get { return age; }
set { age = value; }
}

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

在这个例子中,BirthYear 属性会根据当前年份和年龄计算出出生年份。

总结

C#属性访问器提供了一种灵活的方式来访问和修改类的私有字段。通过使用 getset 访问器,我们可以在访问或修改字段时添加额外的逻辑,例如验证或计算。自动实现的属性进一步简化了代码,使得属性的定义更加简洁。

附加资源

练习

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