访问字符串属性时为什么会出现空引用错误?

时间:2015-01-13 16:51:09

标签: c#

更新:非常感谢您提供的信息。我一直在努力,直到我开始在这里输入更新。不得不说出来。我有从DB中提取的代码:

             potentials[k].Address1 = reader.IsDBNull(reader.GetOrdinal("Address1"))
                                ? string.Empty // that was reading null...
                                : reader.GetString(reader.GetOrdinal("Address"));

原帖:

public class PotentialInformation
{
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
}

public class PotentialCollection : IEnumerable
{
    private Dictionary<string, PotentialInformation> listOfPotentials = new Dictionary<string, PotentialInformation>();
    public PotentialInformation this[string k]
    {
        get { return listOfPotentials[k]; }
        set { listOfPotentials[k] = value; }
    }

    public void Filter()
    {
        foreach (KeyValuePair<string, PotentialInformation> a in listOfPotentials)
        {
            Console.WriteLine("Addr1 {0} {1}, addr2 {2} {3}, addr3 {4} {5}", 
                a.Value.Address1.ToString(),
                a.Value.Address1.GetType(),
                a.Value.Address2.ToString(),
                a.Value.Address2.GetType(),
                a.Value.Address3.ToString(),
                a.Value.Address3.GetType()
                );
        }

抛出的错误: System.NullReferenceException未处理   的HResult = -2147467261   Message =对象引用未设置为对象的实例。

在每个行的情况下,Address1中都有一个条目,但Addresses2和3为null或空。

我已经尝试过:

            if( String.IsNullOrEmpty(a.Value.Address2) == false ) 
            if( String.IsNullOrEmpty(a.Value.Address2.ToString()) == false ) 

关于我处理Address2和3中的空值的方式是错误的,但我是C#的新手,并且很难弄清楚它是什么。感谢。

3 个答案:

答案 0 :(得分:4)

在C#中,空stringnull对象引用之间存在差异。 null对象是未分配的引用,而空string是对string对象的指定对象引用,该对象具有空值(即一个不是对象,一个是对象但是没有价值)。

使用构造函数指定string.Empty值,并且您的空引用异常将消失,因为您可以在空字符串对象上调用方法,但不能在空引用上调用。

答案 1 :(得分:2)

字符串是reference type,与任何引用类型一样,如果未初始化,如果您尝试访问它,则会获得NullReferenceException尝试创建类似此类的私有字段

private string _adress1 = string.Empty ;  

然后你可以做这样的事情

public string Address1 
         { get {return _adress1;} set{ _adress1=value;} }

答案 2 :(得分:2)

NullReferenceException对象上调用成员或方法的任何时候都会发生

null,因为CLR无法处理尝试查找字面上不存在的成员。这意味着如果Address2.GetType()Address3.ToString()为空,Address2Address3将抛出异常。

解决此问题的最佳方法是在调用任何成员函数之前检查Address2 / Address3是否为空 - 在第二个示例中,抛出异常,因为您的第二个{{1} }语句不会检查if,第二行仍然会针对Address3调用.ToString()

您还可以通过在Address2的构造函数中为Address2Address3分配空字符串来解决此问题 - 因为PotentialInformation是一个类,默认值为{ {1}}而不是和空字符串。