掌握C#中的get和set访问器:实现属性封装与数据验证
|
admin
2024年3月19日 11:20
本文热度 514
|
在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 编辑过