C# 3 での 'var' キーワードの使用に関して同僚と話し合った後、var による型推論の適切な使用法について人々の意見がどのようなものか知りたいと思いました。
たとえば、私は疑わしい状況で var を怠惰に使用しました。例:
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
var のより正当な使用法は次のとおりです:-
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
興味深いことに、LINQ は少しグレーゾーンのようです。例:
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
IEnumerable を実装する型になるので結果がどうなるかは明らかですが、新しいオブジェクトを宣言する var と同じように完全に明らかというわけではありません。
オブジェクトへの LINQ の場合はさらに悪いです。例:
var results = from item in someList
where item != 3
select item;
これは同等の foreach(var item in someList) { // ... } と変わりません。
ここでは型の安全性について本当に懸念があります。たとえば、そのクエリの結果を、IEnumerable<int> と IEnumerable<double> を受け入れるオーバーロードされたメソッドに配置すると、呼び出し元が誤って間違った型を渡す可能性があります。
var
強力な型付けは維持されますが、問題は、定義時に型がすぐに明らかにならないことが危険であるかどうかです。オーバーロードによって、メソッドに意図せず間違った型を渡したときにコンパイラ エラーが発行されない可能性がある場合、この問題はさらに大きくなります。
ベストアンサー1
それでも、場合によってはコードをより読みやすくできると思いますvar
。Orders プロパティを持つ Customer クラスがあり、それを変数に割り当てたい場合は、次のようにします。
var orders = cust.Orders;
Customer.Orders が であるかどうかは気にしません。私が望むのはIEnumerable<Order>
、そのリストをメモリ内に保持して、後で反復処理したり、そのカウントを取得したりすることだけです。ObservableCollection<Order>
BindingList<Order>
上記の宣言を次の宣言と比較してください。
ObservableCollection<Order> orders = cust.Orders;
私にとって、型名は単なるノイズです。そして、戻って Customer.Orders の型を後で変更することに決めた場合 (たとえば、 から に変更する場合ObservableCollection<Order>
) IList<Order>
、その宣言も変更する必要があります。これは、最初に var を使用していれば行う必要のないことです。