跳到主要内容

C# 属性验证

在C#编程中,属性验证是一种确保对象属性值符合预期规则的技术。通过验证,我们可以防止无效数据进入系统,从而提高代码的健壮性和可靠性。本文将详细介绍如何在C#中实现属性验证,并通过实际案例展示其应用。

什么是属性验证?

属性验证是指在设置属性值时,检查该值是否符合预定义的规则或条件。如果值不符合规则,程序可以抛出异常或采取其他措施来防止无效数据的传播。

为什么需要属性验证?

  • 数据完整性:确保数据符合业务规则。
  • 错误预防:在数据进入系统之前捕获错误。
  • 代码健壮性:减少因无效数据导致的运行时错误。

基本属性验证

在C#中,属性验证通常通过属性的 set 访问器实现。以下是一个简单的示例:

csharp
public class Person
{
private string _name;

public string Name
{
get { return _name; }
set
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("Name cannot be null or whitespace.");
}
_name = value;
}
}
}

在这个示例中,Name 属性的 set 访问器检查传入的值是否为 null 或空白字符串。如果是,则抛出 ArgumentException

示例运行

csharp
Person person = new Person();
person.Name = "John"; // 有效
person.Name = ""; // 抛出 ArgumentException

使用数据注解进行验证

C# 提供了数据注解(Data Annotations)来简化属性验证。数据注解是一种声明式的方式,用于定义验证规则。

示例:使用数据注解

csharp
using System.ComponentModel.DataAnnotations;

public class Product
{
[Required(ErrorMessage = "Name is required.")]
[StringLength(100, ErrorMessage = "Name cannot be longer than 100 characters.")]
public string Name { get; set; }

[Range(0, 1000, ErrorMessage = "Price must be between 0 and 1000.")]
public decimal Price { get; set; }
}

在这个示例中,Name 属性被标记为必填项,并且长度不能超过100个字符。Price 属性的值必须在0到1000之间。

验证对象

csharp
Product product = new Product { Name = "", Price = -10 };
var context = new ValidationContext(product, null, null);
var results = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(product, context, results, true);

if (!isValid)
{
foreach (var validationResult in results)
{
Console.WriteLine(validationResult.ErrorMessage);
}
}

输出:

Name is required.
Price must be between 0 and 1000.

实际应用场景

用户注册表单

假设我们有一个用户注册表单,需要验证用户输入的用户名、密码和电子邮件地址。

csharp
public class User
{
[Required(ErrorMessage = "Username is required.")]
[StringLength(20, ErrorMessage = "Username cannot be longer than 20 characters.")]
public string Username { get; set; }

[Required(ErrorMessage = "Password is required.")]
[MinLength(6, ErrorMessage = "Password must be at least 6 characters long.")]
public string Password { get; set; }

[EmailAddress(ErrorMessage = "Invalid email address.")]
public string Email { get; set; }
}

验证用户输入

csharp
User user = new User { Username = "user", Password = "123", Email = "invalid-email" };
var context = new ValidationContext(user, null, null);
var results = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(user, context, results, true);

if (!isValid)
{
foreach (var validationResult in results)
{
Console.WriteLine(validationResult.ErrorMessage);
}
}

输出:

Password must be at least 6 characters long.
Invalid email address.

总结

属性验证是C#编程中确保数据完整性和正确性的重要技术。通过属性验证,我们可以在数据进入系统之前捕获错误,从而提高代码的健壮性和可靠性。本文介绍了基本属性验证和使用数据注解进行验证的方法,并通过实际应用场景展示了其重要性。

附加资源与练习

通过不断练习和探索,你将能够熟练掌握C#中的属性验证技术,并在实际项目中灵活运用。