質問: (Clazz)null; Clazz fuga; } public class Clazz { // 任意のユーザークラス } ```
回答: C#言語ではコンパイラはほとんど最適化を行わず、愚直にコード生成します。`null`代入のコードが書かれれば、 ``` ldnull stloc.0 ``` とそのままのコードになります。 その上でこの程度のコードにコストはほぼかからないでしょうし、JITによる最適化で、差異はほぼなくなると思います。 別の視点で、`null`代入すべきではありません。適切なスコープで変数を宣言・代入することで、変数の値が常に有効になるようにコードを記述し、`null`になるタイミングを極力減らすべきです。 C#言語では変数を宣言しても値を代入するまでは参照できません。代入前に参照するコードはコンパイラーがエラーとして検出します。`null`代入するコーディング規約を定めてしまうと、これが有効に機能せず、コードが安全でなくなります。 当たり前ですが、変数が常に`null`にならないのであれば、`null`テストが不要になりコードがより安全になります。 加えてC# 8.0でnull許容参照型が導入されました。変数や戻り値が`null`になり得るかをコードで表現できるようになり、またコンパイラーがチェックできるようになりました。 以上のことから、`var hoge = (Clazz)null;`という表現は避けるべきです。