プログラミングでアンチパターンという用語に出くわしました。例の1つはこれでした。
IList values = new ArrayList(); //Anti-pattern, bad
ArrayList values = new ArrayList(); //good
この2つのバリアントの違いは何ですか?varキーワードを使用する場合と同じではありませんか?
私はList
あなたが本当に意味すると思いますIList
。
IList values = new ArrayList();
ArrayList
オブジェクトをオブジェクトとして表示するだけですIList
。必要に応じて、キャストバックできArrayList
ます。
ArrayList values = new ArrayList()
と同じですvar values = new ArrayList()
どちらも実際にはアンチパターンではありません。提供するメソッドだけが必要な場合はIList
、何を割り当てるかに関係なく、使用する必要のあるオブジェクトのタイプのみを宣言することをお勧めします。これは、あるタイプのパブリックインターフェイスでより重要です。ローカル変数として; どちらの方法でも実際には問題ではありません。
の利点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>>>>
この分離では、ほとんど無関係です。
List values = new ArrayList();
ArrayList values = new ArrayList();
var values = new ArrayList();
ここでは、メソッド本体内で値が宣言されており、抽象化や分離についてはあまり気にしないためです。
しかし、リストへの割り当ては、利点のない値の使用に制限を加えるだけであることに同意します。これは AnitPattern だと言う人もいるかもしれませんが、もっと関連性の高い AntiPatterns があります。
ArrayList と var の方が優れています。ほとんどの場合、var が最も読みやすく、保守しやすいでしょう。私は個人的に var を使用します。
余談ですが、これらのコレクションを使用する人はほとんどいません。ArrayList は List よりも好まれることがありますが、ここでも個人的には後者を使用しています。