为什么我在访问字符串属性时收到空引用错误

本文关键字:引用 错误 属性 访问 字符串 为什么 | 更新日期: 2023-09-27 18:37:19

更新:非常感谢大家提供的信息。 我一直在为此苦苦挣扎,直到我开始在这里输入更新。 不得不说出来。 我有从数据库中提取的代码:

             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 消息=对象引用未设置为对象的实例。

在每行情况下,地址 1 中都有一个条目,但地址 2 和 3 为空或空。

我试过做:

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

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

为什么我在访问字符串属性时收到空引用错误

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

使用构造函数赋值string.Empty null 引用异常将消失,因为您可以对空字符串对象调用方法,但不能对 null 引用调用方法。

字符串

是一个reference type,就像任何引用类型一样,如果没有初始化,你会得到一个NullReferenceException如果你尝试访问它,尝试创建一个私有字段,

如下所示
private string _adress1 = string.Empty ;  

然后你可以做这样的事情

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

每当调用null对象上的成员或方法时,都会发生NullReferenceException,因为 CLR 无法处理尝试查找实际上不存在的成员。这意味着,如果Address2Address3为 null,Address2.GetType()Address3.ToString()将引发异常。

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

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