【问题标题】:Does ArrayList in C# can contain objects various types?C# 中的 ArrayList 是否可以包含各种类型的对象?
【发布时间】:2013-03-09 07:51:40
【问题描述】:

有没有可能,做这样的事情:

ArrayList arl = new ArrayList();
arl.Add(1);
arl.Add("test");

int[,] tab = new int[4, 4];
init(tab);

arl.Add(tab);

是否可以包含各种类型的对象(如 JavaScript 或 Lua)? (C#)

【问题讨论】:

  • 这会产生编译错误吗? ArrayList 包含对象
  • 尝试运行看看 C# 编译器如何反应
  • 您至少尝试过一次吗?我在这里没有看到任何努力..
  • 看看这个已经讨论过的[ArrayList中的对象] [1]:stackoverflow.com/questions/3367524/…
  • 你应该问问自己为什么需要这样做。您很少需要使用静态类型语言。

标签: c# arraylist


【解决方案1】:

是的,因为它不做任何类型检查,它有时在使用引用类型时比List<T> 更快,但通常不建议在有引用类型时使用它一个完美的类型安全替代方案。

object 继承的任何类型都可以存储在ArrayList 中。每当您访问 ArrayList 中的项目时,您必须小心将其转换为正确的类型,否则您将收到编译器错误。

我相信ArrayList 是 .Net 中泛型类型出现之前的旧遗物

【讨论】:

  • 什么? ……你错了。事实上,由于运行时类型检查,当将对象转换回时它会变慢..
  • 取决于您在 arraylist 中存储的内容,对于引用类型 ArrayList 实际上要快一点(公平起见可以忽略不计),通过在 1000000 次迭代中向 arraylist 添加引用类型进行测试并确认.另一方面,添加到List<int> 比添加到ArrayList 快得多。
  • 我想我读错了你的答案。按照我的解释,您是说ArrayList 的执行速度总是比List<class> 快.. 这不是您的意思吗?
  • 不,我不是这个意思,我想我可以用不同的措辞,我会编辑我的帖子以澄清一些事情
【解决方案2】:

至于你的问题,是的,ArrayList 可以包含各种对象类型。
微软一般建议改用List<T>,以防止在使用object 时需要装箱和拆箱相同的类型。

如果您有重复的类型模式,那么定义自定义类可能会更有帮助(并且更快):

protected class arl_items
{
   public string item1 {get; set;};
   public int item2 {get; set;};
   public int[4,4] item3 {get; set;};
}

然后去:

List<arl_items> arl = new List<arl_items>();

但如果您的值类型没有模式,您也可以使用ArrayList,因为创建List&lt;object&gt; 将毫无意义,因为它们是相同的。

顺便说一句。我更喜欢使用 List&lt;object&gt; 而不是 ArrayList,但这只是我个人的喜好

【讨论】:

  • ..也许在这里澄清您对通用List&lt;object&gt; 的使用。我会否决您的答案,但我不确定您是说ArrayListList&lt;object&gt; 本质上是相同的(它们是),还是您说使用List&lt;object&gt; 而不是ArrayList(这是毫无意义的)。
  • @SimonWhitehead 谢谢,我不知道我在答案中混入了太多个人喜好
【解决方案3】:

ArrayList 中可以有不同的类型 试试这个:

var ary = new ArrayList();

ary.Add("some string");
ary.Add(23.4);
ary.Add(new StringBuilder());
ary.Add("some other string");

然后你可以像这样查询它:

string[] strings = ary.OfType<string>();
StringBuilder[] stringBuilders = ary.OfType<StringBuilder>(); 

【讨论】:

    【解决方案4】:

    是的,这是可能的。 ArrayList 存储object 类型的集合,这意味着您可以插入任何.NET 类型。

    你真的应该使用List&lt;T&gt;。例如:

     List<int> listIntegers = new List<int>();
     listIntegers.Add(1);
    

    您也可以使用List&lt;object&gt;,但是您必须将列表中的所有项目拆箱。这可能会导致性能问题。

    【讨论】:

    • 这似乎是一个随机投票者。我刚刚在这里问的两个问题被否决了,没有什么特别的原因..:/
    • 我之前有过,你可以发邮件到stackoverflow来处理。
    【解决方案5】:

    是的,ArrayList 包含对象类型的元素,因此这意味着您可以将所有内容放入其中。再次检索它时,您可以将其恢复为原始类型。 当然,由于这种铸造效率较低。

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 2011-11-16
      • 1970-01-01
      • 2019-07-14
      • 2012-01-03
      • 2017-11-10
      • 2014-09-19
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多