0

嘿,我正在尝试使用 C# 中的通用列表,并且由于某种原因,在为列表分配内存后,我得到了 unhandeledNullException。

 //edit

我发现我的问题是我没有正确使用这些属性。如果让我们说 GeoInfo 是我班级的私人成员,我该如何对其进行属性处理,我尝试过:

 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

在此先感谢您的帮助

4

2 回答 2

1

If you want a property to be private, use

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

However, there's not a lot of reason to use an auto property for a private member variable (and don't forget to initialize that list as well). If you want validation fine, but you're just using that property as a private variable.

Your null reference issue probably comes from not initializing the underlying property variable. That does not get done automatically, so

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

One more thing: your naming convension for a property is odd for C#. How about keeping things consistent and sing GeoInfos?

于 2010-11-07T22:13:52.353 回答
1

您已将属性设为私有。如果您希望它们公开,请尝试:

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

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

因为您要声明的是属性访问器。

如果您想明确地编写所有内容,则可以使用旧的 pre 3.0 方式

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

这仍然依赖于在某处(如构造函数)初始化的 geoInfos——nullPointerException或者将返回。

您可以在 getter 中对其进行惰性评估:

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

这确保您不必在构造函数中指定调用,并且您不必担心在获取元素之前显式设置元素的执行顺序。

但是如果你使用自动生成的属性,你将不得不在某个时候显式地设置引用。正如其他地方所建议的那样,最好的选择是构造函数。

于 2010-11-07T22:56:02.990 回答