掌握C#中的get和set访问器:实现属性封装与数据验证
				
									
					
					
						|  | 
							admin 2024年3月19日 11:20
								本文热度 1848 | 
					
				 
				在C#中,get和set访问器是属性(Property)的重要组成部分,它们分别用于读取和设置属性的值。通过使用get和set访问器,我们可以控制对属性值的访问,实现数据的封装和验证。
一、属性的基本结构
在C#中,属性通常是一个特殊的成员,它提供了对字段或数据的访问。一个属性由两部分组成:get访问器和set访问器。
public class Person
{
    private string _name; // 私有字段
    // 属性定义
    public string Name
    {
        get // get访问器,用于读取_name字段的值
        {
            return _name;
        }
        set // set访问器,用于设置_name字段的值
        {
            _name = value; // value是set访问器的隐式参数,表示要设置的新值
        }
    }
}
二、只读和只写属性
get和set访问器不是必须的,我们可以根据需要只定义一个。如果只有get访问器,则属性是只读的;如果只有set访问器,则属性是只写的。
public class ReadOnlyPerson
{
    private string _name;
    // 只读属性
    public string Name
    {
        get
        {
            return _name;
        }
    }
}
public class WriteOnlyPerson
{
    private string _name;
    // 只写属性
    public string Name
    {
        set
        {
            _name = value;
        }
    }
}
三、数据验证
set访问器是执行数据验证的理想位置。我们可以在设置属性值之前检查其有效性,并据此决定是否允许设置。
public class ValidatedPerson
{
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (!string.IsNullOrWhiteSpace(value) && value.Length <= 50)
            {
                _name = value;
            }
            else
            {
                throw new ArgumentException("Name must be a non-empty string with a maximum length of 50 characters.");
            }
        }
    }
}
四、自动实现的属性
在C#中,如果属性不需要额外的逻辑,我们可以使用自动实现的属性,这样编译器会自动为我们创建私有的后备字段。
public class AutoImplementedPerson
{
    // 自动实现的属性
    public string Name { get; set; }
}
五、例子代码
下面是一个简单的例子,演示了如何使用get和set访问器封装一个Person类的属性,并在设置属性值时执行验证。
using System;
public class Person
{
    private string _name;
    private int _age;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (!string.IsNullOrWhiteSpace(value))
            {
                _name = value;
            }
            else
            {
                throw new ArgumentException("Name cannot be null or whitespace.");
            }
        }
    }
    public int Age
    {
        get
        {
            return _age;
        }
        set
        {
            if (value >= 0)
            {
                _age = value;
            }
            else
            {
                throw new ArgumentException("Age cannot be negative.");
            }
        }
    }
    public void DisplayDetails()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}
class Program
{
    static void Main()
    {
        Person person = new Person();
        try
        {
            person.Name = "Alice";
            person.Age = 25;
            person.DisplayDetails();
            person.Age = -1; // 这将抛出异常,因为年龄不能为负
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
在这个例子中,Person类有两个属性:Name和`
该文章在 2024/3/19 11:20:01 编辑过