更新:非常感谢您提供的信息。我一直在努力,直到我开始在这里输入更新。不得不说出来。我有从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#的新手,并且很难弄清楚它是什么。感谢。
答案 0 :(得分:4)
在C#中,空string
和null
对象引用之间存在差异。 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()
为空,Address2
或Address3
将抛出异常。
解决此问题的最佳方法是在调用任何成员函数之前检查Address2
/ Address3
是否为空 - 在第二个示例中,抛出异常,因为您的第二个{{1} }语句不会检查if
,第二行仍然会针对Address3
调用.ToString()
。
您还可以通过在Address2
的构造函数中为Address2
和Address3
分配空字符串来解决此问题 - 因为PotentialInformation
是一个类,默认值为{ {1}}而不是和空字符串。