【C#】短絡演算(ショートカット演算)
左式で全体の結果が明白である場合、以降の演算をスキップする機能。
例えば、false && true であれば、左式であるfalseを評価した時点で、全体の結果がfalseになるのが明白なので、以降の演算はスキップされる。
nullチェックを左式に置くなどして、NullReferenceExceptionを避けられる。
&や|と書くと、演算はスキップされない。
特別な理由が無い限りは、短絡演算を使用する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
static void Main(string[] args) { Sample sample = new Sample(); //コンソールの出力から左辺と右辺両方のgetterが実行されていることがわかる Console.WriteLine("====== | 演算 ======"); Console.WriteLine(sample.BoolT | sample.BoolF); Console.WriteLine("====== & 演算 ======"); Console.WriteLine(sample.BoolF & sample.BoolT); //コンソールの出力から左辺のみのgetterが実行されていることがわかる Console.WriteLine("====== || 演算(短絡評価) ======"); Console.WriteLine(sample.BoolT || sample.BoolF); Console.WriteLine("====== && 演算(短絡評価) ======"); Console.WriteLine(sample.BoolF && sample.BoolT); Console.ReadKey(); } //値をgetする時にConsoleに出力するクラス。 public class Sample { private bool boolT = true; public bool BoolT { get { Console.WriteLine("get BoolT"); return boolT; } set { boolT = value; } } private bool boolF = false; public bool BoolF { get { Console.WriteLine("get BoolF"); return boolF; } set { boolF = value; } } } |
短絡評価時は、getterのログが1行しか出ていないことから、結果がわかった時点で判定処理を中断していることがわかる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
====== | 演算 ====== get BoolT get BoolF True ====== & 演算 ====== get BoolF get BoolT False ====== || 演算(短絡評価) ====== get BoolT True ====== && 演算(短絡評価) ====== get BoolF False |