get和set在 C# 中的用法及介绍

145 阅读3分钟

getset 在 C# 中的用法及介绍

在 C# 中,getset 是用于定义属性(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 属性赋值,不能读取其值。

带有逻辑的访问器

可以在 getset 访问器中添加逻辑,例如进行数据验证:

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 类包含了自动实现的属性、带有逻辑的属性、只读属性,以及一个方法来演示属性的使用。通过这些属性,封装了内部数据,并提供了对这些数据的受控访问。