【问题标题】:"Storing" value types inside an ArrayList在 ArrayList 中“存储”值类型
【发布时间】:2012-01-10 15:07:37
【问题描述】:

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?

【问题讨论】:

  • How does "boxing" work in .NET? 的可能重复项
  • 不是真的 - 如果你已经知道这个问题的答案,你只会知道这两者是相关的。
  • @Binary worrier - 这是同一个主题,但你需要知道它是如何被调用的......
  • @mavnn 这并不意味着它们不是同一个东西,虽然;p 一点重复(尤其是不同的标题等)是健康的。

标签: c# .net arraylist


【解决方案1】:

这称为“装箱”:int 自动转换为引用类型。这确实会降低性能。

另见Boxing and Unboxing

【讨论】:

    【解决方案2】:

    如果你在 ILSpy 中调用 ArrayList 类,你会看到后备存储是:

    private object[] _items;
    

    并且Add 方法接受object 类型的实例:

    public virtual int Add(object value) { ... }
    

    因此,当您使用整数调用 Add 时,.NET boxes 会将该整数添加到 ArrayList 中的 _items 数组中作为 object

    顺便说一句,如果您需要一个仅包含整数的 ArrayList 并且您使用的是 .NET 2.0 Framework 或更高版本,则应该改用 List<T>(又名泛型 List)类,因为它避免了具有在从列表中存储或检索 int 时将其装箱(请参阅最后一个链接中的性能注意事项部分)。

    【讨论】:

      【解决方案3】:

      它叫拳击。 “Box”包含结构的副本以及它是什么类型的详细信息。

      MSDN:http://msdn.microsoft.com/en-us/library/yz2be5wk%28v=vs.80%29.aspx

      在 framework 2.0 + 中,微软为我们提供了更快、更有效的泛型:

      MSDN:http://msdn.microsoft.com/en-us/library/ms172192.aspx

      【讨论】:

        【解决方案4】:

        Arraylist.Add() 将加法取任意值并作为对象加法,因此整数值会自动转换(装箱)并添加到数组列表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-20
          • 2017-11-13
          • 1970-01-01
          相关资源
          最近更新 更多