64129


タイトルの通りです。

変数宣言時に `var` で統一するために敢えてキャストして `null` を代入する方法と、

きちんと型を指定した場合で処理速度等のパフォーマンスに差が出たりとか、違いがあったりするのでしょうが？

私の妄想ですが、これくらいの差異、コンパイラがうまく最適化している気もしますが...

[code]

    static void Main(string[] args)
    {
        var hoge = (Clazz)null;
    
        Clazz fuga;
    }
    
    public class Clazz
    {
        // 任意のユーザークラス
    }
    
[/code]


CC BY-SA 4.0
2020-03-26T07:35:44.753
64128
2020-03-26T22:29:07.363
2020-03-26T10:25:25.397
19110
37413
question
c# .net .net-core
変数宣言 "var hoge = (Clazz)null;" と "Clazz hoge;" の違い


C#言語ではコンパイラはほとんど最適化を行わず、愚直にコード生成します。`null`代入のコードが書かれれば、

[code]

    ldnull
    stloc.0
    
[/code]

とそのままのコードになります。

その上でこの程度のコードにコストはほぼかからないでしょうし、JITによる最適化で、差異はほぼなくなると思います。

* * *

別の視点で、`null`代入すべきではありません。適切なスコープで変数を宣言・代入することで、変数の値が常に有効になるようにコードを記述し、`null`になるタイミングを極力減らすべきです。  
C#言語では変数を宣言しても値を代入するまでは参照できません。代入前に参照するコードはコンパイラーがエラーとして検出します。`null`代入するコーディング規約を定めてしまうと、これが有効に機能せず、コードが安全でなくなります。  
当たり前ですが、変数が常に`null`にならないのであれば、`null`テストが不要になりコードがより安全になります。

加えてC#
8.0で[null許容参照型](https://ufcpp.net/study/csharp/resource/nullablereferencetype/)が導入されました。変数や戻り値が`null`になり得るかをコードで表現できるようになり、またコンパイラーがチェックできるようになりました。

以上のことから、`var hoge = (Clazz)null;`という表現は避けるべきです。


CC BY-SA 4.0
2020-03-26T08:31:16.613
64129
2020-03-26T22:29:07.363
2020-03-26T22:29:07.363
4236
4236
64128
answer