1. ホーム
  2. c#

[解決済み】C#のvarキーワードの使い方

2022-04-15 13:59:33

質問

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 to Objectsになると、さらにひどいことになります。

var results = from item in someList
              where item != 3
              select item;

これでは、等価な foreach(var item in someList) { // ... と同じです。} と同じです。

例えば、IEnumerable<int> と IEnumerable<double> を受け入れるオーバーロードされたメソッドにこのクエリの結果を配置すると、呼び出し側が不注意に間違った型を渡す可能性があります。

var する これは、オーバーロードによって、意図せずに間違った型をメソッドに渡したときにコンパイラーエラーが発生しない可能性がある場合に顕著になります。

解決するには?

やはり var は、場合によってはコードをより読みやすくすることができます。CustomerクラスにOrdersプロパティがあり、それを変数に代入したい場合、私はこうするだけです。

var orders = cust.Orders;

私は、Customer.Ordersが IEnumerable<Order> , ObservableCollection<Order> または BindingList<Order> - は、そのリストをメモリに保持し、後で反復処理したり、そのカウントを取得したりしたいだけです。

上記の宣言と対照的です。

ObservableCollection<Order> orders = cust.Orders;

私にとっては、型名は単なるノイズに過ぎません。そして、もし私がこの先Customer.Ordersの型を変更することにした場合(例えば、Customer.Ordersの型を ObservableCollection<Order> から IList<Order> を使用した場合、その宣言も変更する必要があります。これは、最初の段階でvarを使用していれば必要ないことです。