C# 有办法实现 &&= 吗?
Does C# have a way to &&=?
我有几个布尔值需要检查并转换为单个布尔值以提高可读性:
bool myBoolean = 5 == 5 && "string" == "String" && true && false && CheckSomethingElse();
有什么方法可以将其分成多行以使其更具可读性?我可以做到:
bool myBoolean = 5 == 5;
myBoolean = myBoolean && "string" == "String";
myBoolean = myBoolean && true;
myBoolean = myBoolean && false;
myBoolean = myBoolean && CheckSomethingElse();
但我正在寻找更多类似的东西:
bool myBoolean = 5 == 5;
myBoolean &= "string" == "String";
myBoolean &= true;
myBoolean &= false;
myBoolean &= CheckSomethingElse();
然而,第三个代码块与 first/second 的功能不同(据我所知)。 C# 是否有办法提高第一个代码块的可读性?或者是否有某种正常的方法来编写这样的布尔值?
为了可读性,只需将其提取到命名方法中,方法名称会立即告诉您意图:
public bool FluxCapacitorIsReady()
{
return 5 == 5
&& "string" == "String"
&& true
&& false
&& CheckSomethingElse();
}
现在您只需在代码中调用该方法,reader 任何人都可以立即清楚发生了什么:
if (FluxCapacitorIsReady())
StartFluxCapacitor();
这是 Clean Code 中的一个概念:有关更多信息,请参阅 http://cleancoders.com。
首先,我可能同意 JK 等关于重写的一些意见,但要根据 SO 指南实际回答你的问题,正确答案是否定的,因为该运算符未在 C# 中定义,你不能重载像布尔类型那样的新运算符。
我认为最好的方法是为布尔类型定义一个扩展方法
public static class BoolExtension{
public static bool And(this Boolean first, bool second){
first = first && second;
return first;
}
public static bool MultiAnd(this Boolean first, params bool[] others)
{
foreach (var b in others) first = first && b;
return first;
}
}
然后像这样使用它
bool myBoolean = 5 == 5;
myBoolean.And( "string" == "String");
myBoolean.MultiAnd("A"=="A","B"=="C","D"=="D");
如您所见,这可能对可读性没有多大帮助。
在这种情况下,有些人最终通过定义一个 struct/class 来实现布尔值 class 的装饰器模式,其中包含一个布尔值并执行您喜欢的运算符重载。
我有几个布尔值需要检查并转换为单个布尔值以提高可读性:
bool myBoolean = 5 == 5 && "string" == "String" && true && false && CheckSomethingElse();
有什么方法可以将其分成多行以使其更具可读性?我可以做到:
bool myBoolean = 5 == 5;
myBoolean = myBoolean && "string" == "String";
myBoolean = myBoolean && true;
myBoolean = myBoolean && false;
myBoolean = myBoolean && CheckSomethingElse();
但我正在寻找更多类似的东西:
bool myBoolean = 5 == 5;
myBoolean &= "string" == "String";
myBoolean &= true;
myBoolean &= false;
myBoolean &= CheckSomethingElse();
然而,第三个代码块与 first/second 的功能不同(据我所知)。 C# 是否有办法提高第一个代码块的可读性?或者是否有某种正常的方法来编写这样的布尔值?
为了可读性,只需将其提取到命名方法中,方法名称会立即告诉您意图:
public bool FluxCapacitorIsReady()
{
return 5 == 5
&& "string" == "String"
&& true
&& false
&& CheckSomethingElse();
}
现在您只需在代码中调用该方法,reader 任何人都可以立即清楚发生了什么:
if (FluxCapacitorIsReady())
StartFluxCapacitor();
这是 Clean Code 中的一个概念:有关更多信息,请参阅 http://cleancoders.com。
首先,我可能同意 JK 等关于重写的一些意见,但要根据 SO 指南实际回答你的问题,正确答案是否定的,因为该运算符未在 C# 中定义,你不能重载像布尔类型那样的新运算符。
我认为最好的方法是为布尔类型定义一个扩展方法
public static class BoolExtension{
public static bool And(this Boolean first, bool second){
first = first && second;
return first;
}
public static bool MultiAnd(this Boolean first, params bool[] others)
{
foreach (var b in others) first = first && b;
return first;
}
}
然后像这样使用它
bool myBoolean = 5 == 5;
myBoolean.And( "string" == "String");
myBoolean.MultiAnd("A"=="A","B"=="C","D"=="D");
如您所见,这可能对可读性没有多大帮助。
在这种情况下,有些人最终通过定义一个 struct/class 来实现布尔值 class 的装饰器模式,其中包含一个布尔值并执行您喜欢的运算符重载。