检查c#中属性内部的错误输入

本文关键字:错误 输入 内部 属性 检查 | 更新日期: 2023-09-27 18:14:06

我使用属性允许将单个字符串name添加到类Details,我希望属性只接受字符串,如果它可以分成两个部分。

这两部分将是firstNameLastName。然而,如果结果分割在数组中有1,0或超过2个字符串,那么输入应该被认为是无效的,我想首先抛出一个错误给任何称为属性的代码。

可以在这样的属性上进行错误处理吗?

如果不是,那么在检查正确性的同时,下面哪种方法是将数据放入类的首选方法:

  1. 使用Details类中的方法来处理错误输入,将该方法改为boolean
  2. 继续使用属性,但由调用该属性的代码完成错误检查。我不喜欢这样,因为我希望所有的错误检查代码是自包含在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];
        }
    }
}

编辑:我最感兴趣的是三个选项中哪一个被认为是最佳实践:

  1. 在另一个类的类外检查错误,然后将验证的输入添加到Details
  2. Details中使用boolean方法来验证输入

检查c#中属性内部的错误输入

我将遵循现有的验证框架,如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
}