0

プログラミングでアンチパターンという用語に出くわしました。例の1つはこれでした。

IList values = new ArrayList(); //Anti-pattern, bad
ArrayList values = new ArrayList(); //good

この2つのバリアントの違いは何ですか?varキーワードを使用する場合と同じではありませんか?

4

3 に答える 3

4

私はListあなたが本当に意味すると思いますIList

IList values = new ArrayList();ArrayListオブジェクトをオブジェクトとして表示するだけですIList。必要に応じて、キャストバックできArrayListます。

ArrayList values = new ArrayList()と同じですvar values = new ArrayList()

どちらも実際にはアンチパターンではありません。提供するメソッドだけが必要な場合はIList、何を割り当てるかに関係なく、使用する必要のあるオブジェクトのタイプのみを宣言することをお勧めします。これは、あるタイプのパブリックインターフェイスでより重要です。ローカル変数として; どちらの方法でも実際には問題ではありません。

于 2013-03-18T21:28:13.390 に答える
0

の利点IListは、それに割り当てることができるさまざまなクラスがあることです。これは、さまざまなクラスを使用するさまざまな場所からデータを調達している場合に便利です。

IList values;
values = new ArrayList();
values = new object[] {};
values = new List<int>();
values = new DataView();

ただし、 を使用する場合は、IListで定義されたメソッドしか使用できませんIList。変数をArrayListまたはその他の具象クラスとして定義すると、そのクラスのすべてのメソッドにアクセスできます。

ArrayList values = new ArrayList();
values.

キーワードを使用varすると、式の結果と同じクラスを使用するようにコンパイラに指示されます。非常に長いクラスがある場合、これは非常に便利です。

var values = new ArrayList();
// values is ArrayList

// Assuming a function: List<int> GetIntegerList() { ... }
var values = GetIntegerList();
// values is List<int>

// Assuming a function: Dictionary<string, Dictionary<string, List<Tuple<int, int, string>>>> GetSettingsCollection() { ... }
var values = GetSettingsCollection();
// values is Dictionary<string, Dictionary<string, List<Tuple<int, int, string>>>>
于 2013-03-18T23:00:08.287 に答える
0

この分離では、ほとんど無関係です。

List values = new ArrayList();
ArrayList values = new ArrayList();
var values = new ArrayList();

ここでは、メソッド本体内で値が宣言されており、抽象化や分離についてはあまり気にしないためです。

しかし、リストへの割り当ては、利点のないの使用に制限を加えるだけであることに同意します。これは AnitPattern だと言う人もいるかもしれませんが、もっと関連性の高い AntiPatterns があります。

ArrayList と var の方が優れています。ほとんどの場合、var が最も読みやすく、保守しやすいでしょう。私は個人的に var を使用します。

余談ですが、これらのコレクションを使用する人はほとんどいません。ArrayList は List よりも好まれることがありますが、ここでも個人的には後者を使用しています。

于 2013-03-18T21:37:29.180 に答える