11

重複の可能性:
varキーワードのポイントは何ですか?
C#でのvarキーワードの使用

IEnumerable<...>データ型がコードを少し読みにくくする方法や、ネストされたジェネリックが少し気が遠くなるように見える方法を理解しています。しかし、コードの可読性の他に、明示的な型の代わりにvarを使用することには利点がありますか?明示的な型を使用することで、変数が何であるかを知っているので、変数が何をできるかをよりよく伝えることができるようです。

それが職場のコーディング標準である場合、私はチームワークのためにそれを使用します。しかし、私自身のプロジェクトでは、varのユーザーを避けたいと思っています。

4

9 に答える 9

22

varのポイントは、匿名タイプを許可することです。匿名タイプがないと不可能であり、それが存在する理由です。私が考える他のすべての用途は怠惰なコーディングです。

于 2010-08-06T17:03:33.663 に答える
8

foreachブロックのイテレータ変数として使用varする方が、明示的な型名よりも型の安全性が高くなります。例えば

class Item {
  public string Name; 
}
foreach ( Item x in col ) {
  Console.WriteLine(x.Name);
}

このコードは警告なしにコンパイルされ、実行時のキャストエラーを引き起こす可能性があります。これは、foreachループがとの両方IEnumerableで機能するためIEnumerable<T>です。前者はとして入力された値を返しobject、C#コンパイラは内部でキャストをItem実行します。IEnumerableしたがって、は安全ではなく、任意のタイプのオブジェクトを含めることができるため、ランタイムエラーにつながる可能性があります。

一方、次のコードは次のいずれかのみを実行します

  1. xが入力されてobjectいるか、名前フィールド/プロパティを持たない別のタイプであるため、コンパイルされません
  2. コンパイルして、列挙中にランタイムキャストエラーが発生しないことが保証されます。

'x'のタイプはobject、の場合IEnumerableTの場合になりIEnumerable<T>ます。コンパイラーによるキャストは行われません。

foreach ( var x in col ) {
  Console.WriteLine(x.Name);
}
于 2010-08-06T17:01:17.870 に答える
7

コードが進化するにつれて、宣言/割り当ての右側を修正するだけでよいので、特に単体テストでそれが好きです。もちろん、使用法の変更を反映するために更新する必要もありますが、宣言の時点で変更を加える必要があるのは1つだけです。

于 2010-08-06T17:00:26.663 に答える
3

放出されたILに意味のある変化は生じません。これは単なるコードスタイルの設定です。

私は、特に、のような長くて一般的でほとんど読めない名前を持つ型を扱うときに、それが好きDictionary<string, IQueryable<TValue1, TValue2>>[]です。

于 2010-08-06T16:59:45.393 に答える
2

これvarは単なる構文糖衣です。コンパイル時に、変数がどのタイプであるかは常にわかります。varキーワードを使用する他の利点はありません。

于 2010-08-06T17:00:47.943 に答える
2

本当の違いはありません。コードの保守が容易になるため、明示的な型を使用することを提案する人もいます。しかし、これを求める人々はvar、「varを使用すると、適切な命名規則を使用せざるを得なくなる」というスタンスを持っています。

もちろん、適切な命名規則を使用する目的でvarsを使用し、それが機能しなくなった場合、将来的にはより苦痛になります。(IMO)

于 2010-08-06T17:02:54.950 に答える
1
public IAwesome { string Whatever { get; } }
public SoCool : IAwesome { public string Whatever { get; } }

public HeyHey
{
    public SoCool GetSoCool() { return new SoCool(); }

    public void Processy()
    {
        var blech = GetSoCool();
        IAwesome ohYeah = GetSoCool();
        // Now blech != ohYeah, so var is blech and ohYeah is IAwesome.
    }
}
于 2010-08-06T17:05:08.433 に答える
0

あなたが言及した読みやすさの側面に加えて、「var」には、些細なコード変更がコードの他の部分を壊す可能性を減らすという利点もあります。たとえば、タイプの名前を変更した場合。または、前のタイプとほとんど互換性のある別のタイプに切り替える場合(たとえば、Foo []からIEnumerableに変更する場合)、コードをコンパイル可能な状態に戻すために行う作業がはるかに少なくなります。

于 2010-08-06T17:03:13.387 に答える
0

技術の精神的な複雑さを抽象化して、モデルから問題の領域に純粋に焦点を合わせることができます。変数に意味のある名前が付けられていることを確認する必要があります。

于 2010-08-06T17:08:10.067 に答える