在编程中遇到术语反模式,其中一个例子就是这个。
IList values = new ArrayList(); //Anti-pattern, bad
ArrayList values = new ArrayList(); //good
这两种变体有什么区别?它们不一样吗,和使用var 关键字一样吗?
我假设List
你的意思是IList
。
IList values = new ArrayList();
只是让您将ArrayList
对象视为IList
对象。如果你愿意,你可以回滚ArrayList
。
ArrayList values = new ArrayList()
是相同的var values = new ArrayList()
两者都不是真正的反模式。如果您只需要IList
提供的方法,则最好只声明您需要使用的对象的类型,而不管您分配什么。这在类型的公共接口中更为重要。作为局部变量;无论哪种方式都无关紧要。
在这种孤立中,它几乎是无关紧要的。
List values = new ArrayList();
ArrayList values = new ArrayList();
var values = new ArrayList();
因为在这里,值是在方法体内声明的,我们不太关心抽象或隔离。
但我同意,分配给 List 只会限制使用没有优势的值。有人可能会说,这是一个 AnitPattern,但还有更多相关的 AntiPatterns。
ArrayList 和 var 更好, var 通常是最可读和可维护的。我个人会使用 var。
顺便说一句,几乎没有人再使用这些集合了,ArrayList 有时比 List 更受欢迎,但我个人在这里也使用后者。
它的优点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>>>>