C#在setter方法上添加validation

我有一些我在C#中定义的变量:

public String firstName { get; set; } public String lastName { get; set; } public String organization { get; set; } 

我想要的是在您尝试设置值时为这些方法添加validation。 让我们说你要为firstName设置一个值,我应该通过thrue regexp来设置,否则应该抛出exception。 是否可以使用这种“短语法”构建,或者我应该选择标准(如JAVA)getter和setter并在那里validation数据?

如果要validation何时设置属性,则需要使用非自动属性(即手动定义的getset方法)。

但另一种validation方法是将validation逻辑与域对象分开。

 class Customer { public string FirstName { get; set; } public string LastName { get; set; } public string Organization { get; set; } } interface IValidator { bool Validate(T t); } class CustomerValidator : IValidator { public bool Validate(Customer t) { // validation logic } } 

然后,你可以说:

 Customer customer = // populate customer var validator = new CustomerValidator(); if(!validator.Validate(customer)) { // head splode } 

这是我更喜欢的方法:

  1. Customer不应负责validation自己的数据,这是另一项责任 ,因此应该在其他地方生活。
  2. 不同的情况为同一域对象调用不同的validation逻辑。

您现在所拥有的称为“自动属性”,只执行简单的“获取/设置”。 为了自定义getset的行为,您需要将属性转换为字段支持的属性:

 private string _firstName; public string FirstName { get {return _firstName;} set { Validate(value); _firstName = value; } } 

请注意,我将String更改为string并将属性名称大写,遵循接受的C#命名最佳实践。

我根本不会在setter中添加validation。 相反,我会创建一个名为validate的函数……这样,所有validation代码都在一个位置,而不是分散在整个setters

您必须使用完整属性语法。