0

在编程中遇到术语反模式,其中一个例子就是这个。

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

这两种变体有什么区别?它们不一样吗,和使用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

在这种孤立中,它几乎是无关紧要的。

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

因为在这里,值是在方法体内声明的,我们不太关心抽象或隔离。

但我同意,分配给 List 只会限制使用没有优势的值。有人可能会说,这是一个 AnitPattern,但还有更多相关的 AntiPatterns。

ArrayList 和 var 更好, var 通常是最可读和可维护的。我个人会使用 var。

顺便说一句,几乎没有人再使用这些集合了,ArrayList 有时比 List 更受欢迎,但我个人在这里也使用后者。

于 2013-03-18T21:37:29.180 回答
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 回答