【发布时间】:2015-07-31 00:13:40
【问题描述】:
我有一个名为 connectedEntites 的通用列表,我在 for 循环中将项目添加到此列表中。我在添加之前做了一个空检查。但即便如此,每当一个项目被添加到这个List<> 时,也会添加一个空值。我进行了调试,但无法添加空值。由于这个空值,当我执行读取操作时程序崩溃(因为这是一个 COM 程序)。
下面是类的代码
public class EntityDetails
{
public ObjectId objId { get; set; }
public Handle objHandle { get; set; }
public string className { get; set; }
public override bool Equals(object obj)
{
if (obj == null) return false;
EntityDetails objAsEntityDetails = obj as EntityDetails;
if (objAsEntityDetails == null) return false;
else return Equals(objAsEntityDetails);
}
public bool Equals(EntityDetails other)
{
if (other == null)
return false;
return (this.objId.Equals(other.objId));
}
}`
在下图中,您可以看到空值,并且随着项目的添加,容量也会翻倍,但计数显示正确的值。
【问题讨论】:
-
是的,它说 2。但是为什么是空值?
-
空值在 List 使用的内部数组中。这是一个不应该关注的实现细节。您以哪种方式使用列表来获取异常/崩溃? (而且它们是空值,因为那是
default(EntityDetails)) -
@Santosh 如果抛出 NullRefException 那么这是因为 i.className 为空。枚举 List 只会返回“有效”项,而不是内部数组中的每个项。
-
您只会看到该数组,因为您正在使用甚至显示私有成员的调试器。那是造成你的困惑。通常您看不到也无法访问用于存储项目的内部数组。由于分配新数组是一项相对昂贵的操作,因此它的容量翻了一番。
标签: c# generic-list