Programming languages 避免多重If';c#中的s-最佳实践
情景: 假设我们要检查地址行。其中包括addressline1、addressline2、城镇、国家、邮政编码 如果输入任何一个属性,则所有其他字段都是必填字段。 如果没有输入任何内容,则不必触发验证 为了实现它,我最终得到了两行If语句。 像Programming languages 避免多重If';c#中的s-最佳实践,programming-languages,c#-3.0,Programming Languages,C# 3.0,情景: 假设我们要检查地址行。其中包括addressline1、addressline2、城镇、国家、邮政编码 如果输入任何一个属性,则所有其他字段都是必填字段。 如果没有输入任何内容,则不必触发验证 为了实现它,我最终得到了两行If语句。 像 注意:我使用的是c#。有什么语言结构我可以使用。嗯,空合并操作符可以帮助实现第一个: if (AddressLine1 ?? AddressLine2 ?? Town ?? Country != null) { if (AddressLine1
注意:我使用的是c#。有什么语言结构我可以使用。嗯,空合并操作符可以帮助实现第一个:
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
语句,但我认为这在这里基本上是必要的。如果您在组中创建一个字段数组,那么您可以执行以下操作:
var fields = new object[] {AddressLine1, AddressLine2, Town, Country};
return fields.All(f => f == null) || fields.All(f => f != null);
这样称呼:
var addressValid = IsAddressValid(AddressLine1, AddressLine2, Town, County);
定义如下:
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);
Jon,你能澄清一下你是应该使用
params object[]
还是IEnumerable
作为静态方法的数据类型吗?@Kane:我已经使用了params object[]
,这样你就可以把它称为IsAnyNull(x,y,z等)
,而不是显式地创建一个新集合。
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);