C#|ヨーダ記法とは?定数を左に書く理由と、使いどころ
はじめに
ヨーダ記法とは、比較式で定数を左、変数を右に書くスタイルのことです。
先輩のコードやネットのサンプルで if (StateEnum.Normal == _state) のような式を見かけて、「なぜ逆に書くのだろう」と不思議に思ったことはありませんか。この記事では、ヨーダ記法の意味、生まれた理由、C#での使いどころを順番に説明します。

ポイント1 ヨーダ記法とは
ヨーダ記法(Yoda conditions)は、比較式の左側に定数、右側に変数を書くスタイルです。
映画「スター・ウォーズ」のヨーダは、「お前は強い」を「強いな、お前は」のように、語順を入れ替えて話します。比較式の語順が入れ替わっている様子がこの話し方に似ているので、この名前が付きました。
if (_state == StateEnum.Normal) // 通常の書き方
if (StateEnum.Normal == _state) // ヨーダ記法
== は左右を入れ替えても結果が変わらないので、2つの式の意味は同じです。
ポイント2 なぜ生まれたのか
ヨーダ記法は、=(代入)と ==(比較)の書き間違いを防ぐ工夫として生まれました。
C言語やC++では、比較の == を代入の = と書き間違えても、コンパイルが通ってしまいます。
if (x = 5) // x に 5 を代入してしまう。条件は常に真になり、バグに気づけない
if (5 = x) // 5 には代入できないので、コンパイルエラーで気づける
定数を左に置いておくと、書き間違えた時点でコンパイラが教えてくれます。「人間のうっかりを、コンパイラに見つけてもらう」ための書き方です。
ポイント3 C#では必須ではない
C#では、書き間違いの多くをコンパイラが見つけてくれるので、ヨーダ記法は必須ではありません。
C#の if は bool しか受け付けません。そのため、int や列挙型の比較で = と書き間違えると、コンパイルエラーになります。
int x = 0;
if (x = 5) { } // エラー: int を bool に変換できない
if (_state = StateEnum.Normal) { } // エラー: 列挙型を bool に変換できない
唯一の例外は bool 型の変数です。代入した結果も bool になるため、書き間違いがそのまま通ってしまいます。
bool isDead = false;
if (isDead = true) { } // コンパイルは通る。isDead に true を代入してしまう
bool の変数は if (isDead) と直接書けるので、== true と書かなければ、この間違いは起きません。
ポイント4 C#で役立つ場面
C#でヨーダ記法が役立つのは、文字列の .Equals を使うときです。定数側を先に書くと、変数が null でも例外が出ません。
string name = null;
bool a = name.Equals("abc"); // NullReferenceException(例外で止まる)
bool b = "abc".Equals(name); // false を返す
name.Equals(...) は「name の持つメソッドを呼ぶ」という意味なので、name が null だと呼び出せません。"abc".Equals(name) なら、呼び出す側が必ず存在する文字列なので、安全に比較できます。
ポイント5 欠点と、今どきの書き方
ヨーダ記法の欠点は、読みにくいことです。「_state が Normal か」と自然に読む順番ではないので、コードを読む人が一瞬立ち止まります。
C#では、ヨーダ記法を使わなくても、null を安全に比べる書き方があります。
if (_state == StateEnum.Normal) // 素直に書く(C#ならこれで十分)
if (name == "abc") // == なら name が null でも例外にならない
if (string.Equals(name, "abc")) // static メソッドも null に強い
if (_state is StateEnum.Normal) // is で定数と比べる書き方
普段は素直な語順で書き、null が入る可能性がある文字列の .Equals のときだけ、定数側を先に書くのがおすすめです。
まとめ
- ヨーダ記法は、「定数 == 変数」の順で書くスタイルです。
- 元は、
=と==の書き間違いを防ぐ工夫です。 - C#では書き間違いがほとんど起きないので、必須ではありません。
- 文字列の
.Equalsでは、定数側を先に書くとnullで例外が出ません。
ヨーダ記法を見かけたら、「書き間違いを防ぐ工夫なんだな」と読み取れれば十分です。自分で書くときは、読みやすい語順を基本にしましょう。











ディスカッション
コメント一覧
まだ、コメントがありません