前職でコーディング規約を整備しましょうという話になり、配られたコーディング規約にC#の型指定でvarを使うという内容がありました。新卒の研修の際にはvarはネガティブな説明だったので驚いたのですが、採用した理由はMicrosoftのコーディング規約を参考にしたからとのこと。今ではvarをメインに使っています。
C#のvarとは
暗黙の型指定
ローカル変数を定義するときは明示的な型指定を行う必要がありません。コンパイラがコードから型を推測してビルドしてくれるので、型に関わらずvarで良いわけです。
var integer = 1; var str = string.Empty; var byteArray = new byte[] { 0x00, 0x01 }; var intList = new List<int>();
グローバル変数では使えない
一方で、プロパティを含むグローバル変数では使用することができません。
public class SampleClass { public int Integer { get; set; } public string Str { get; set; } public byte[] ByteArray { get; set; } public IntList { get; set; } double doubleValue; string str2; public SampleClass() { var integer = 1; var str = string.Empty; var byteArray = new byte[] { 0x00, 0x01 }; var intList = new List<int>(); } }
C#でvarを使うべき理由
Microsoftが使用を推奨している
C#の開発元であるMicrosoftが使用を推奨しているのが大きいですね。そもそも推奨しないものを追加するわけがないというのもありますが。
C# のコーディング規則 (C# プログラミング ガイド) | Microsoft Docs
モダンな言語では暗黙の型推論が主流
MicrosoftがC#にvarを何故導入したのかという視点も大事です。昔の動的型付けの悲劇からvarを忌み嫌う人もクライアントサイドにはしぶとく生き残っていますが、そもそもvarは動的型付けではなく型推論で別物です。型推論はSwiftやKotlinなどモダンな言語では主流どころか、型推論を強制してきます。これらの言語と比べたらレガシーな書き方も許容するC#は寛容な良い言語とも言えるかもしれません。
Swift
var str: string = "text"
Kotlin
var s: String = "text"
可読性が向上する
可読性の向上がvarを使う1つの理由でもあります。可読性が下がると思っている人もいると思うのですが、慣れるとvar以外が紛れ込むと嫌になってきます。
var firstName = "Taro"; var secondName = "Yamada"; var age = 20; var school = Schools.ABC; var address = Addresses["Tokyo"];
string firstName = "Taro"; string secondName = "Yamada"; int age = 20; Schools school = Schools.ABC; Dictionary<string, string> address = Addresses["Tokyo"];
雑な例ですが、varで統一すると変数名の位置が揃うので見やすくなります。Microsoftのコーディング規約では右辺から型が明確でない場合はvarを使うなと書いてあるのですが、Visual Studioならマウスカーソル合わせるだけで型は分かるので、個人的にはローカル変数は全てvarでも良いと思います。ここら辺はチームや会社で話し合って決めてください。