get 和 set 在 C# 中的用法及介绍
在 C# 中,get 和 set 是用于定义属性(Property)的访问器。属性是类、结构或接口中的成员,它们提供了通过方法的语法来访问字段的机制。get 访问器用于返回属性的值,set 访问器用于分配属性的值。
基本概念
属性声明
一个属性的基本声明形式如下:
public class Person
{
private string name; // 私有字段
public string Name
{
get { return name; }
set { name = value; }
}
}
在这个示例中:
name是一个私有字段,存储Name属性的实际数据。Name属性有一个get访问器,用于返回name字段的值。Name属性有一个set访问器,用于设置name字段的值。
自动实现的属性
自动实现的属性简化了属性的声明,不需要显式定义私有字段。编译器会自动创建私有的后备字段。
public class Person
{
public string Name { get; set; }
}
这是上述代码的简化版本,具有相同的功能。
访问器的详细说明
get 访问器
get 访问器用于返回属性的值。它的语法如下:
public string Name
{
get { return name; }
}
在调用属性时,get 访问器会被执行:
Person person = new Person();
person.Name = "John";
Console.WriteLine(person.Name); // 输出 "John"
set 访问器
set 访问器用于设置属性的值。它的语法如下:
public string Name
{
set { name = value; }
}
在给属性赋值时,set 访问器会被执行:
Person person = new Person();
person.Name = "John"; // 调用 set 访问器
在 set 访问器中,value 是一个隐含的参数,表示赋给属性的新值。
只读和只写属性
只读属性
如果一个属性只有 get 访问器,那么它就是一个只读属性。
public class Person
{
private string name;
public string Name
{
get { return name; }
}
public Person(string name)
{
this.name = name;
}
}
此时只能读取 Name 属性,不能对其赋值。
只写属性
如果一个属性只有 set 访问器,那么它就是一个只写属性。
public class Person
{
private string name;
public string Name
{
set { name = value; }
}
}
此时只能对 Name 属性赋值,不能读取其值。
带有逻辑的访问器
可以在 get 和 set 访问器中添加逻辑,例如进行数据验证:
public class Person
{
private int age;
public int Age
{
get { return age; }
set
{
if (value < 0 || value > 120)
throw new ArgumentOutOfRangeException("Age must be between 0 and 120.");
age = value;
}
}
}
在这个示例中,set 访问器中包含了验证逻辑,确保 Age 属性只能设置为 0 到 120 之间的值。
属性的用途和优势
- 封装性:通过属性,可以在不改变外部代码的情况下更改类的实现细节。
- 数据验证:可以在
set访问器中添加验证逻辑,以确保数据的正确性。 - 调试和维护:在属性访问器中可以添加日志记录或调试信息,便于跟踪和维护代码。
示例总结
以下是一个综合示例,展示了属性的各种用法:
using System;
public class Person
{
private string name;
private int age;
// 自动实现的属性
public string Gender { get; set; }
// 带有逻辑的属性
public string Name
{
get { return name; }
set
{
if (string.IsNullOrEmpty(value))
throw new ArgumentException("Name cannot be empty.");
name = value;
}
}
// 只读属性
public int Age
{
get { return age; }
}
public Person(string name, int age, string gender)
{
Name = name;
this.age = age;
Gender = gender;
}
public void GrowOlder()
{
age++;
}
}
public class Program
{
public static void Main()
{
Person person = new Person("John", 30, "Male");
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Gender: {person.Gender}");
person.Name = "Doe";
person.GrowOlder();
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, Gender: {person.Gender}");
// person.Age = 40; // 这是错误的,因为 Age 是只读属性
}
}
在这个示例中,Person 类包含了自动实现的属性、带有逻辑的属性、只读属性,以及一个方法来演示属性的使用。通过这些属性,封装了内部数据,并提供了对这些数据的受控访问。