2010-11-07 19 views
0

嘿,我想尝试在C#中的通用列表和由于某种原因后分配列表内存我得到unhandeledNullException。与C列表中的空列表异常#

//edit 

我发现了什么是我的问题,我没有正确使用属性。 如果可以说,地理信息是我班的私有成员,我该怎么办性质的, 我想:

private List<GeoInfo> GEOINFOS { get; set; } // edit i forgot to change it back 
// but i want to have my geoinfos private and my properties public 

在此先感谢您的帮助

+6

是'UnhandledException'或'ArgumentNullException' - 请澄清。而且,这个代码本身并没有什么错误*我认为你将不得不添加更多的上下文;理想情况下是一个可重复的例子 – 2010-11-07 21:52:21

+0

这条线本身看起来不错。你能发布更多的代码吗?这可能是其他原因造成的。 – eldarerathis 2010-11-07 21:52:42

+4

请发布一个简短但完整的程序来演示问题。这很可能是简单的事情,但我们无法从这条线上看出来。 – 2010-11-07 21:54:39

回答

1

您已将该属性设置为私有。如果你想他们是公众的尝试:

public List<GeoInfo> GeoInfos { get; set; } 

本地存储的对象将是私人的自动实现的价值;但属性本身是公开的。

因为你声明的是属性存取器。

如果你想明确地写了一切,你能做到这一点的老预3.0方式

private List<GeoInfo> geoInfos = new List<GeoInfo>; 
public List<GeoInfo> GeoInfos { 
    get { return geoInfos; } 
    set { geoInfos = value; } 
} 

这仍然依靠geoInfos初始化某处(如构造函数) - 或nullPointerException将返回。

您可以直接在吸气做懒评价它:

private List<GeoInfo> geoInfos = new List<GeoInfo>; 
public List<GeoInfo> GeoInfos { 
    get { if (geoInfos == null) { 
      geoInfos = new List<GeoInfo>; 
     } 
     return geoInfos; 
     } 
    set { geoInfos = value; } 
} 

这可以确保你没有指定在构造函数的调用,而不必担心执行顺序在获取它之前明确地设置元素。

但是,如果您使用自动生成的属性,您将不得不在某个点明确设置引用。如其他地方所建议的,最好的选择是构造函数。

1

如果你想有一个属性为私有使用

private List<GeoInfo> GEOINFOS { get; set; } 

然而,有没有很多理由来使用自动属性的私有成员变量(不要忘了初始化列表以及)。如果您希望验证正确,但您只是将该属性用作私有变量。

您的空引用问题可能来自未初始化基础属性变量。这并没有得到自动完成的,所以

public MyClass() 
{ 
    GEOINFOS = new List<GeoInfo>(); 
} 

一两件事:一个属性的命名convension是奇数为C#。如何保持一致并唱歌GeoInfos?

+1

对于一个完全私人的汽车财产,你会使用私人列表 GeoInfos {get;组; }'。 – LukeH 2010-11-07 22:16:06

+0

就像@Luke所说的,一个私人的getter + setter公共财产不会飞。但为命名建议+1 – 2010-11-07 22:20:15

+0

我不希望我的物业是私人我希望他们公开 – 2010-11-07 22:22:05