ArrayList
类只能包含对象的引用,但是当存储诸如整数的值类型时会发生什么?
string str = "Hello";
int i = 50;
ArrayList arraylist = new ArrayList();
arraylist.Add(str); // Makes perfectly sense:
// Reference to string-object (instance) "Hello" is added to
// index number 0
arraylist.Add(i); // What happens here? How can a reference point to a value
// type? Is the value type automatically converted to an
// object and thereafter added to the ArrayList?
答案 0 :(得分:12)
它被称为“拳击”:自动将int转换为引用类型。这确实会带来一些性能。
答案 1 :(得分:2)
如果您在ILSpy中提取ArrayList
类,您将看到后备存储是:
private object[] _items;
并且Add
方法接受object
类型的实例:
public virtual int Add(object value) { ... }
因此,当您使用整数,Add
整数调用_items
时,它会被ArrayList
中的object
数组添加为ArrayList
}}
顺便提一下,如果你需要int
只是整数并且你正在使用.NET 2.0 Framework或更高版本,那么你应该使用boxes(也就是通用List)类,这样做会更好因为它避免了在列表中存储或检索它时必须打{{1}}(参见最后一个链接中的性能注意事项部分)。
答案 2 :(得分:1)
它叫拳击。 “Box”包含结构的副本以及它的类型的详细信息。
MSDN:http://msdn.microsoft.com/en-us/library/yz2be5wk%28v=vs.80%29.aspx
在框架2.0中,microsoft为我们提供了更快,更有效的泛型:
答案 3 :(得分:0)
Arraylist.Add()将添加任意值并添加为对象,因此整数值将自动转换(装箱)并添加到arraylist中。