当前位置: 欣欣网 > 码农

掌握C#中的get和set访问器:实现属性封装与数据验证

2024-02-27码农

在C#中, get set 访问器是属性(Property)的重要组成部分,它们分别用于读取和设置属性的值。通过使用 get set 访问器,我们可以控制对属性值的访问,实现数据的封装和验证。

一、属性的基本结构

在C#中,属性通常是一个特殊的成员,它提供了对字段或数据的访问。一个属性由两部分组成: get 访问器和 set 访问器。

public classPerson
{
privatestring _name; // 私有字段
// 属性定义
publicstring Name
{
get// get访问器,用于读取_name字段的值
{
return _name;
}
set// set访问器,用于设置_name字段的值
{
_name = value// value是set访问器的隐式参数,表示要设置的新值
}
}
}

二、只读和只写属性

get set 访问器不是必须的,我们可以根据需要只定义一个。如果只有 get 访问器,则属性是只读的;如果只有 set 访问器,则属性是只写的。

public classReadOnlyPerson
{
privatestring _name;
// 只读属性
publicstring Name
{
get
{
return _name;
}
}
}
public classWriteOnlyPerson
{
privatestring _name;
// 只写属性
publicstring Name
{
set
{
_name = value;
}
}
}

三、数据验证

set 访问器是执行数据验证的理想位置。我们可以在设置属性值之前检查其有效性,并据此决定是否允许设置。

public classValidatedPerson
{
privatestring _name;
publicstring Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrWhiteSpace(value) && value.Length <= 50)
{
_name = value;
}
else
{
thrownew ArgumentException("Name must be a non-empty string with a maximum length of 50 characters.");
}
}
}
}

四、自动实现的属性

在C#中,如果属性不需要额外的逻辑,我们可以使用自动实现的属性,这样编译器会自动为我们创建私有的后备字段。

public classAutoImplementedPerson
{
// 自动实现的属性
publicstring Name { getset; }
}

五、例子代码

下面是一个简单的例子,演示了如何使用 get set 访问器封装一个 Person 类的属性,并在设置属性值时执行验证。

using System;
public classPerson
{
privatestring _name;
privateint _age;
publicstring Name
{
get
{
return _name;
}
set
{
if (!string.IsNullOrWhiteSpace(value))
{
_name = value;
}
else
{
thrownew ArgumentException("Name cannot be null or whitespace.");
}
}
}
publicint Age
{
get
{
return _age;
}
set
{
if (value >= 0)
{
_age = value;
}
else
{
thrownew ArgumentException("Age cannot be negative.");
}
}
}
publicvoidDisplayDetails()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
classProgram
{
staticvoidMain()
{
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 和`