在c#中避免多个ifs - 最佳实践

时间:2010-10-28 12:28:30

标签: programming-languages c#-3.0

方案: 让我们说我们要检查地址线。其中包括addressline1,addressline2,Town,Country,Postcode 如果输入任何一个属性,则所有其他字段都是必填字段。 如果没有输入,验证不必被触发。

为实现这一目标,我最终得到了两行If语句。 喜欢

if(AddressLine1 != null || AddressLine2 != null || Town != null || Country != null)
{
    if(AddressLine1 != null && AddressLine2 != null && Town != null && Country != null) == false
     {
          return false;
     }   
}

注意:我正在使用c#。有没有可以使用的语言结构。

4 个答案:

答案 0 :(得分:8)

private bool IsAddressValid(params string[] addressParts)
{
    return addressParts.Any(p => p != null) ? addressParts.All(p => p != null) : true;
}

像这样被召唤:

var addressValid = IsAddressValid(AddressLine1, AddressLine2, Town, County);

答案 1 :(得分:6)

好吧,null-coalescing运算符可以帮助第一个:

if (AddressLine1 ?? AddressLine2 ?? Town ?? Country != null)
{
    if (AddressLine1 == null || AddressLine2 == null ||
        Town == null || Country == null)
    {
        return false;
    }
    // Presumably there's more here
}

您可能希望编写一些辅助方法:

if (IsAnyNonNull(AddressLine1, AddressLine2, Town, Country))
{
    if (IsAnyNull(AddressLine1, AddressLine2, Town, Country))
    {
        return false;
    }
}

实用程序方法类似于:

public static bool IsAnyNonNull(params object[] values)
{
    return values.Any(x => x != null);
}

public static bool IsAnyNull(params object[] values)
{
    return values.Any(x => x == null);
}

当然,你仍然有两个if陈述 - 但我认为无论如何这基本上是必要的。

答案 2 :(得分:6)

如果你在组中创建一个字段数组,那么你可以这样做:

var fields = new object[] {AddressLine1, AddressLine2, Town, Country};
return fields.All(f => f == null) || fields.All(f => f != null);

答案 3 :(得分:0)

定义:

public static bool SameNullness(params object[] values)
{
    int nullCount = 0;
    foreach (var value in values)
    {
        if (value == null) nullCount++;
    }

    return nullCount == values.Length;
}

然后使用它:

SameNullness(AddressLine1, AddressLine2, Town, Country);