检查c#中属性内部的错误输入
本文关键字:错误 输入 内部 属性 检查 | 更新日期: 2023-09-27 18:14:06
我使用属性允许将单个字符串name
添加到类Details
,我希望属性只接受字符串,如果它可以分成两个部分。
这两部分将是firstName
和LastName
。然而,如果结果分割在数组中有1,0或超过2个字符串,那么输入应该被认为是无效的,我想首先抛出一个错误给任何称为属性的代码。
可以在这样的属性上进行错误处理吗?
如果不是,那么在检查正确性的同时,下面哪种方法是将数据放入类的首选方法:
- 使用
Details
类中的方法来处理错误输入,将该方法改为boolean
。 - 继续使用属性,但由调用该属性的代码完成错误检查。我不喜欢这样,因为我希望所有的错误检查代码是自包含在
Details
类。
.
class Details
{
private string firstName, lastName;
public string Name
{
// name
get { return firstName + " " + lastName; }
set
{
string name = value;
string[] nameArray = name.Split(' ');
firstName = nameArray[0];
lastName = nameArray[1];
}
}
}
编辑:我最感兴趣的是三个选项中哪一个被认为是最佳实践:
- 在另一个类的类外检查错误,然后将验证的输入添加到
Details
- 在
Details
中使用boolean
方法来验证输入
我将遵循现有的验证框架,如FluentValidation。
此外,在您的具体情况下,我将有一个SetName(字符串fullName)方法,做解析和填充。
为什么不使用exception来捕获错误条件呢?
private string firstName, lastName;
public string Name
{
get { return string.Concat(firstName, " ", lastName); }
set
{
string name = value;
if (string.IsNullOrEmpty(name)) { throw new ArgumentNullException("Name"); }
var nameParts = name.Trim().Split(' ');
if (nameParts.Length != 2) { throw new ArgumentException("Invalid name value"); }
firstName = nameParts[0];
lastName = nameParts[1];
}
}
只是把我的观点添加到其他人所说的内容中,在我看来,部分困难源于这样一个事实,即您正在使用属性setter来做一些重要的事情(拆分字符串,验证结果,然后将结果存储在两个字段中)。一般来说,属性,特别是读/写属性,应该只关心获取和设置单个值(使用只读属性返回一个简单的计算值也很常见)。
如果是我,我会为名字和姓氏设置单独的属性,为全名设置第三个计算属性:
class Details
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName
{
get { return string.Concat(this.FirstName, " ", this.LastName); }
}
}
然后您可以添加一个方法来设置全名。对于这个任务来说,方法比属性设置器更合适,因为它很重要,而且更有可能出现问题:
public void SetFullName(string fullName)
{
string[] nameComponents = fullName.split(' ');
if (nameComponents.Length != 2)
{
throw new ArgumentException("The full name must contain a first and last name.");
}
this.FirstName = nameComponents[0];
this.LastName = nameComponents[1];
}
我还想为代码契约包提供一个插件。它可能比您期望的要复杂,但它是验证应用程序中输入和输出的好方法。
所以我不会认为不符合业务逻辑的数据是异常,因此不会抛出异常。我要做的是:
class Details
{
private string firstName, lastName;
public string Name
{
// name
get { return firstName + " " + lastName; }
set
{
string name = value;
string[] nameArray = name.Split(' ');
if(nameArray.Length == 2)
{
firstName = nameArray[0];
lastName = nameArray[1];
}
else
{
firstName = nameArray[0];
lastName = string.Empty;
}
}
}
public bool IsValid()
{
return !string.IsNullOrEmpty(lastName);
}
}
您可以使用name属性,然后检查名称是否有效。如果无效,则可以采取适当的措施。
另一个选择是在调用Details.Name.
编辑:想删除我认为不好的建议,但保留一些评论是有意义的,所以把它们删掉
EDIT2:
你也可以这样做:
类的细节{private string firstName, lastName;
public string Name
{
get { return firstName + " " + lastName; }
private set;
}
public bool TryParseName(string name)
{
bool isValid = true;
string[] nameParts = name.split(' ');
if(nameParts.Length == 2)
{
firstName = nameParts[0];
lastName = nameParts[1];
}
else
{
isValid = false;
}
return isValid;
}
}
你会怎么做
if(details.TryParseName(name))
{
// is valid name
}
else
{
// handle invalid name
}