为什么我在访问字符串属性时收到空引用错误
本文关键字:引用 错误 属性 访问 字符串 为什么 | 更新日期: 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# 中,空string
和null
对象引用之间存在差异。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 无法处理尝试查找实际上不存在的成员。这意味着,如果Address2
或Address3
为 null,Address2.GetType()
或Address3.ToString()
将引发异常。
解决此问题的最佳方法是在调用其任何成员函数之前检查Address2
/Address3
是否为 null - 在第二个示例中,抛出异常是因为您的第二个 if
语句不检查Address3
,并且第二行仍在针对Address2
调用.ToString()
。
您还可以通过在 PotentialInformation
的构造函数中为 Address2
和 Address3
分配一个空字符串来解决此问题 - 由于string
是一个类,默认值为 null
而不是空字符串。