C# 使用特殊字符检查属性值重构

C# 使用特殊字符检查属性值重构,c#,refactoring,C#,Refactoring,如何重构此方法?我不喜欢“if”语句实现您可以从一个return语句开始: private bool CompareCharacters(string specialCharacters, AddressViewModel x) { if (x.Index.Any(specialCharacters.Contains) || x.Area.Any(specialCharacters.Contains) || ...)

如何重构此方法?我不喜欢“if”语句实现

您可以从一个return语句开始:

    private bool CompareCharacters(string specialCharacters, AddressViewModel x)
    {
        if (x.Index.Any(specialCharacters.Contains) || 
            x.Area.Any(specialCharacters.Contains) || ...) 
           return false;
        else
           return true;
    }
您是否需要在调用之间更改
特殊字符
?如果不是,您可以将其作为参数删除,只需拥有一个私有常量字段。您可能还希望提取一个私有方法来比较单个字符串,以便只调用:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return !x.Index.Any(specialCharacters.Contains) &&
           !x.Area.Any(specialCharacters.Contains);
}
或者,如果您有很多字符串,您甚至可以(在性能开销很小的情况下)使用
params
参数创建一个方法,并使用:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return ValidateCharacters(x.Index) &&
           ValidateCharacters(x.Area);
}

您可以从一个return语句开始:

    private bool CompareCharacters(string specialCharacters, AddressViewModel x)
    {
        if (x.Index.Any(specialCharacters.Contains) || 
            x.Area.Any(specialCharacters.Contains) || ...) 
           return false;
        else
           return true;
    }
您是否需要在调用之间更改
特殊字符
?如果不是,您可以将其作为参数删除,只需拥有一个私有常量字段。您可能还希望提取一个私有方法来比较单个字符串,以便只调用:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return !x.Index.Any(specialCharacters.Contains) &&
           !x.Area.Any(specialCharacters.Contains);
}
或者,如果您有很多字符串,您甚至可以(在性能开销很小的情况下)使用
params
参数创建一个方法,并使用:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return ValidateCharacters(x.Index) &&
           ValidateCharacters(x.Area);
}

据我所知,您需要的行为是检查属性是否包含specialCharacters字符串中的任何字符。如果不是这样,我很抱歉

无论如何,我会使用正则表达式。对于正则表达式,您在specialCharacters中列出的大多数字符都应该转义。所以代码看起来像:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return ValidateCharacters(x.Index, x.Area, x.StreetName, x.Home, ...);
}
string specialCharacters=@“\~\!\\\\\\\\\\\\\\\\\\\\\$\\\\%\\\^\\\\&\*\\\\+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[\\\\\\\\\]\\\\\\\\\\\\[\\\\\\\\\\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\|/|=|\\|№";
公共bool ValidateCharacters(字符串模式、AddressViewModel模型)
{
var reg=新的正则表达式(模式);
return reg.IsMatch(model.Index)==false和®.IsMatch(model.Area)==false;
}

我对名称进行了一些重构,我更愿意将此方法作为AddressViewModel的成员函数。此外,例如,有一些关于.Net framework支持的验证的非常好的文章。

据我所知,您需要的行为是检查您的属性是否包含任何字符rs在specialCharacters字符串中。如果不是这样,我很抱歉

无论如何,我会使用正则表达式。您在specialCharacters中列出的大多数字符都应该转义为正则表达式。因此代码如下所示:

private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
    return ValidateCharacters(x.Index, x.Area, x.StreetName, x.Home, ...);
}
string specialCharacters=@“\~\!\\\@\\\\\\\\$\\”|\^|\&|\*|_|\+|\||\{|\}|:\""|\|\?|\[|\]|;|'|/|=|\\|№";
公共bool ValidateCharacters(字符串模式、AddressViewModel模型)
{
var reg=新的正则表达式(模式);
return reg.IsMatch(model.Index)==false和®.IsMatch(model.Area)==false;
}

我对名称进行了一些重构,我更愿意将此方法作为AddressViewModel的成员函数。此外,例如,有一些关于.Net framework支持的验证的非常好的文章。

当涉及布尔分布属性时,是否有合理的理由选择
!(x | | y)
over
!x&&!y
或者这几乎只是个人偏好吗?@Jonesy:如果可能的话,我更喜欢避免括号。我发现它更容易阅读。@Jonesy:不,它不是真的。如果
x
真的
,则不会计算
y
,括号内的完整语句计算结果为
真的
@Sayse:No,它们将同时退出。如果
x
true
,则两个
!(x | | y)
!x&&!y
将简化电路并避免对
y
@JonSkeet进行评估-啊,当然,我会坚持喝我急需的咖啡当涉及到布尔分布属性时,有没有合理的理由选择
!(x | | y)
over
!x&&!y
或者这几乎只是个人偏好吗?@Jonesy:如果可能的话,我更喜欢避免括号。我发现它更容易阅读。@Jonesy:不,它不是真的。如果
x
真的
,则不会计算
y
,括号内的完整语句计算结果为
真的
@Sayse:No如果
x
true
,那么
!(x | | y)
!x&&!y
都会短路,避免计算
y
@JonSkeet-当然,我会坚持喝我急需的咖啡