Where /如何实例化一个对象来处理null引用异常

时间:2013-05-08 20:50:43

标签: c# constructor nullreferenceexception objectinstantiation

嘿伙计们这是一个简单的问题,我不确定在哪里/如何初始化一个新的对象实例,所以我没有得到这个错误。我有一个类对象(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()
    { }

}

4 个答案:

答案 0 :(得分:1)

如果您想保证构造ContactInfo infoContact不为空,您需要在构建时检查它。考虑这样的事情:

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

另一方面,如果没有ContactContactInfo永远不会有效,那么只提供带ContactInfo的构造函数,如果ContactInfo为null,则应该扔一个ArgumentNullException