こんにちは、mickです。
最近よく C# 触ってます。
ほぼ初めてレベルなんですが、C++ や Java の経験値のおかげで調べればすぐに分かる程度で済んでます。
結構新鮮で思ったより楽しんでコーディング中。
C# のお作法を調べていて面白かったのが、var型の話。
VB(Visual Basic)時代には、嫌われものだったvar型。
結局使っていいのか、悪いのか。
結論から書くと、「扱う型が明確なときは使うべき」、です。
C# の var型はバリアントじゃない
自分も勘違いしてました。
var型は VB 時代のバリアントを意味するものじゃないということです。
var キーワードは “バリアント” を意味するのではなく、変数の厳密でない型指定や遅延バインディングを示すものでもないことを理解することが重要です。 単に、最も適切な型をコンパイラが決定して割り当てることを意味します。
暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)
var型は、「暗黙的な型」といわれます。
この逆は、「明示的な型」です。
var i = 10; // 暗黙的な型
int i = 10; // 明示的な型
var型はコンパイル時に型が明確になる
C# の var型は、コンパイル時に型チェックをします。
VB のときみたいに実行時に初めてわかるエラーにはならないわけです。
VBは、プログラムが実行するときに初めて型がわかるので、バグの温床になってデバッグも大変だった歴史があります。
var型は、ローカルメソッドのスコープの変数にのみ適用
C# がコンパイルするときに型が明確にできないから、ということですね。
「Microsoft が var型を推奨」はちょっと言い過ぎ
Microsoft はコーディング規約で var型を使うことを伝えています。
でも同時に注意点もあげているわけなので、手放しにMicrosoftがvar型を推奨しているというのは言い過ぎだと思います。
Microsoft がいうのは「右側の型が明確なときや、forのルーブ変数の型決定で使います」といったところです。
// 推奨している使い方
var var1 = "This is clearly a string.";
var var2 = 27;
// 推奨している使い方
for( var i = 0; i < total; i++)
{
// 処理内容
}
変数の型が割り当ての右側から明らかである場合、または厳密な型が重要でない場合は、ローカル変数の暗黙の型指定を使用します。
暗黙的に型指定されるローカル変数 (C# プログラミング ガイド)
var型の利用を推奨していない使い方
変数名やメソッド名に頼ったり、foreachの型決定に使うことは、避けるよう Microsoft は伝えています。
C# のコーディング規則 | Microsoft Ignite
// 右の型がわかりにくいので明示的な変数とする
int var3 = Convert.ToInt32(Console.ReadLine());
int var4 = ExampleClass.ResultSoFar();
// 次の文ではループ変数を明示的に宣言している
foreach (char ch in laugh)
{
if (ch == 'h')
Console.Write("H");
else
Console.Write(ch);
}
Console.WriteLine();
自分は、上の2つのケースでも使おうとしていたので、危なかった。
セーフ。
まとめ。
var型は使っていいか悪いのか、ということの紹介でした。
いろんなプログラミングしてきた自分からすると、新鮮さもあるのか var型は結構気に入っています。
簡単だし、コンパイル時にちゃんとエラーになるし、コードも見やすくなるし。
ちょっと調べたら、Java でも Java10 から var型が登場しています。
ただ、何も考えずに使うと後でコードが読みづらいものになるし、デバッグも大変になります。
用法、用量は守って使いましょう。
記事を読んでくれて嬉しいです。
今日もありがとうございました。
初稿 2021/10/28