【问题标题】:Difference between List and array when initiating [closed]启动时列表和数组之间的区别[关闭]
【发布时间】:2016-08-14 10:58:59
【问题描述】:

当我这样做时:

List<Person> person = new List<Person>();
person.Print();

我什么都没得到(null)
但是,当我这样做时:

Person[] person2 = new person[10];
person2.Print();

我得到一个例外。
为什么?内存中发生了什么?没看懂。

【问题讨论】:

  • 向我们展示Print 方法。
  • new person[10]; 应该是new Person[10];
  • 没有List&lt;T&gt;.PrintArray.Print 方法。它从何而来?它是一种扩展方法吗?如果有,在哪里?
  • 很可能是一种扩展方法
  • 但是你的标题很糟糕

标签: c# arrays list


【解决方案1】:

好的,

var people = new Person[10]

大致相当于

var people = new List<Person>
   {
       default(Person),
       default(Person),
       default(Person),
       default(Person),
       default(Person),
       default(Person),
       default(Person),
       default(Person),
       default(Person),
       default(Person)
   }

现在,我怀疑您对 Print 的实现,它可能扩展了 IList&lt;Person&gt; 并不能处理 default(Person)


var people = new List<Person>();

其实更等价于

var people = new Person[0];

您的Print 实施是否适用于此?

【讨论】:

  • 问题在于空引用,如果 Person 是一个结构,它不会抛出异常。顺便说一句,它比我的解释得更好。
  • @OscarVicentePerez,如果没有来自 OP 的其他信息,你怎么知道?
  • 猜测...我很确定 Person 是一个类,不同之处在于数组是用空值初始化的。不过是猜测。
  • @OscarVicentePerez,很可能default(Person) == null,但它没有实际意义。
  • 是的,我没有说你的default(Person),因为它是正确的方式,但我认为你应该用你的default(Person) == null更新你的答案
【解决方案2】:

我建议你在什么都不做之前用空检查更新你的方法。

正如@Jodrell 在他的回答中所说,您正在以不同的方式使用它们。

对于 new person[0],您将使用 0 个引用对其进行初始化。但是,如果您使用 10,您将创建 10 个对 null 的引用。该列表不包含任何内容。

我认为在您的 Print 方法中,您正在对集合进行循环,而使用 List 您没有要循环的内容,但是使用数组时您会循环超过 10 个空引用,这会导致您出现异常。

【讨论】:

  • 所以它们是不同的,对吧?
  • 将是原因,但我犹豫要否决,因为 OP 没有显示 Print 方法。
  • 我知道,但我很确定这样的事情......我也会等着看他的代码。
  • 你根本不知道。接受这是第一步。你有一个有根据的猜测,仅此而已。
  • 打印就是这样......循环列表与循环数组
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多