嘿伙计们这是一个简单的问题,我不确定在哪里/如何初始化一个新的对象实例,所以我没有得到这个错误。我有一个类对象(Contact)有另一个类对象(ContactInfo),有时用户决定不输入(实例化)ContactInfo对象。所以稍后当我尝试通过Contact.ContactInfo进行搜索时,我收到错误。下面我有我得到错误的代码行,然后我有两个类:
foreach (var Contact in Contacts)
{
if (String.Equals(Contact._contactInfo.City.ToLower(), city, StringComparison.CurrentCulture))
{
ContactsByCity.Add(Contact);
}
}
然后是两个类:
public class Contact : Person
{
private ContactInfo info;
private ContactInfoLoader loader;
public ContactInfo _contactInfo { get; set; }
public Contact()
{ }
public Contact(ContactInfo _info)
{
info = _info;
}
public ContactInfo GetContactInfo()
{
loader = new ContactInfoLoader(this);
return loader.GatherContactInfo();
}
}
public class ContactInfo
{
public string PhoneNumber { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set;}
public ContactInfo()
{ }
}
答案 0 :(得分:1)
如果您想保证构造ContactInfo info
后Contact
不为空,您需要在构建时检查它。考虑这样的事情:
public class Contact : Person
{
private ContactInfo info;
public ContactInfo _contactInfo { get; set; }
public Contact(ContactInfo _info)
{
if (_info == null)
throw new ArgumentNullException("_info");
info = _info;
}
public Contact(ContactInfoLoader loader)
: this(loader.GatherContactInfo())
{
}
}
类定义的更标准样式但具有等效语义
public class Contact : Person
{
//auto-generates a private field for you
public ContactInfo Info { get; private set; }
public Contact(ContactInfo info)
{
if (info == null)
throw new ArgumentNullException("info");
this.Info = info;
}
public Contact(ContactInfoLoader loader)
: this(loader.GatherContactInfo())
{
}
}
答案 1 :(得分:0)
如果您只是想避免异常,可以说:
if (Contact._contactInfo &&
String.Equals(Contact._contactInfo.City.ToLower(), city,
StringComparison.CurrentCulture))
{
ContactsByCity.Add(Contact);
}
或者,您的无参数构造函数可以添加一个空的ContactInfo
对象:
public Contact()
{
_info = new ContactInfo();
// and make sure the ContactInfo constructor creates non-null, City etc.
}
答案 2 :(得分:0)
在Contact
的无参数构造函数中,我将实例化一个新的ContactInfo
对象。
public Contact()
{
info = new ContactInfo();
}
这将确保无论调用哪个构造函数,任何实例化的Contact
对象都将具有与之关联的非null ContactInfo
对象。
如果将ContactInfo
对象传递给您的Contact
构造函数,则可以执行以下操作:
public Contact(ContactInfo _info)
{
if(_info == null)
_info = new ContactInfo();
info = _info;
}
答案 3 :(得分:0)
如果班级的合同是ContactInfo
可以是null
(因为Contact
没有ContatctInfo
可能是有效的,那么消费者需要检查使用返回的null
之前的ContactInfo
。
另一方面,如果没有Contact
,ContactInfo
永远不会有效,那么只提供带ContactInfo
的构造函数,如果ContactInfo
为null,则应该扔一个ArgumentNullException