developer's diary

最近はc#のエントリが多いです

C# (dotnetcore) 暗黙的な型指定(var)を利用する際の指針

参考書籍

独習C# 新版

独習C# 新版

参考書籍に、「暗黙的な型指定(var)」の使い所が書かれていたので、自分なりに調べてまとめておく。

Q:結局のところ、暗黙的な型指定(var)と明示的な型(2.3.3 項)と、いずれを利用すべきなので しょうか。使い分けのルールなどがあれば、教えてください。

A:マイクロソフトのドキュメントでは、以下のような指針が示されています。

[1] 変数の型が右辺から明らかである場合、または厳密な型が重要でない場合は、暗黙の型指定を使用します。

[2] 右辺から型が明らかではない場合、var を使用しないでください。

[3] 型を指定する際に変数名に頼らないでください。変数名が正しくない場合があります。

[4] dynamic(11.3 節)の代わりに var を使用しないでください。

[5] for / foreach(4.2.3 項)のカウンター変数では、暗黙の型指定を使用します。

マイクロソフトのドキュメントを探す。

ドキュメントみっけ。

docs.microsoft.com

以下ドキュメントの引用と、参考書籍の番号を合わせてみる。

[1] 変数の型が割り当ての右側から明らかである場合、または厳密な型が重要でない場合は、ローカル変数の暗黙の型指定を使用します。

[2] 割り当ての右側から型が明らかではない場合、var を使用しないでください。

[3] 変数の型を指定するときに変数名に頼らないでください。 変数名が正しくない場合があります。

[4] dynamic の代わりに var を使用しないようにしてください。

[5] for ループでループ変数の型を決定するときは、暗黙の型指定が使用されます。

[5] foreach ループでループ変数の型を決定するときは、暗黙の型指定は使用されません。

[5]が少し怪しいが、ほぼほぼこのことを仰られているのでしょう。

英語のドキュメントをGoogle翻訳にかけてみる。

「Do not use implicit typing to determine the type of the loop variable in foreach loops.」

f:id:mitsugi-bb:20200908223635p:plain
Google翻訳の結果

というわけで、この指針がvarの使い所。

dynamic に対するサンプルコードが無いので書いてみる。

Microsoftのドキュメントには、dynamicに関するサンプルがなかったので、 参考書籍のp.557にあるIronPythonを参考にメモっておく。

このコードの実行には、NuGetでIronPythonを追加する必要がある。

        static void Main(string[] args)
        {
            var py = IronPython.Hosting.Python.CreateRuntime();

            using(var sw = new System.IO.StreamWriter("test.py"))
            {
                sw.Write($@"
class ExampleClass:
  def greet(self, name):
    return ""Hello "" + name + "" !""
");
            }

            dynamic script = py.UseFile("test.py");
            dynamic example = script.ExampleClass();
            Console.WriteLine(example.greet("mitsugeek"));
        }

結果

Hello mitsugeek !