true
とfalse
を反転させて再代入するとき、!
演算子を使ってやればいいんですが、長ったらしい変数だとちょっとヤです。
var longNameBecauseGoodNameOmoitsukankatta = true;
longNameBecauseGoodNameOmoitsukankatta = !longNameBecauseGoodNameOmoitsukankatta;
Console.WriteLine(longNameBecauseGoodNameOmoitsukankatta); // false
longNameBecauseGoodNameOmoitsukankatta = !longNameBecauseGoodNameOmoitsukankatta;
Console.WriteLine(longNameBecauseGoodNameOmoitsukankatta); // true
そんなときはxor
演算子の^
を使いましょう。A XOR true
はNOT A
と等価のため、代入演算子^=
を使うとこんなふうに書けます。
var longNameBecauseGoodNameOmoitsukankatta = true;
longNameBecauseGoodNameOmoitsukankatta ^= true;
Console.WriteLine(longNameBecauseGoodNameOmoitsukankatta); // false
longNameBecauseGoodNameOmoitsukankatta ^= true;
Console.WriteLine(longNameBecauseGoodNameOmoitsukankatta); // true
C# 7.2 から拡張メソッドの第一引数にref
をつけられるようになったので、以下の拡張メソッド定義をすると反転値の代入ということがわかりやくなるかもしれません。.Reverse()
は10文字、 ^= true
は8文字なのでちょっと不利ですが・・・。
public static class Ext
{
/// <summary>ブール値を反転して自分自身に設定し、その結果を返します。</summary>
/// <return>反転後のブール値</return>
public static bool Reverse(ref this bool b) => b ^= true;
}
bool a = true;
System.Diagnostics.Debug.WriteLine(a);
System.Diagnostics.Debug.WriteLine(a.Reverse());
System.Diagnostics.Debug.WriteLine(a);
System.Diagnostics.Debug.WriteLine(a.Reverse());
System.Diagnostics.Debug.WriteLine(a);
/* 実行結果
True
False
False
True
True
*/