0

大家好,这是一个简单的问题,我不确定在哪里/如何初始化一个新的对象实例,所以我没有收到这个错误。我有一个类对象(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

4 回答 4

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())
    {
    }
}
于 2013-05-08T20:57:04.587 回答
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.
}
于 2013-05-08T20:56:43.097 回答
0

在您的无参数构造函数中Contact,我将实例化一个新ContactInfo对象。

public Contact()
{ 
    info = new ContactInfo();
}

这将确保无论调用哪个构造函数,任何实例化对象都将具有与之关联Contact的非空对象。ContactInfo

如果将 nullContactInfo对象传递给Contact构造函数,则可以执行以下操作:

public Contact(ContactInfo _info)
{
   if(_info == null)
       _info = new ContactInfo();

   info = _info;
}
于 2013-05-08T20:56:48.163 回答
0

如果类的契约是 that ContactInfocan be null(因为可能 a Contactnot have是有效的),那么消费者在使用返回ContatctInfo的 之前需要检查。 nullContactInfo

另一方面,如果Contact没有 a 就永远无效,ContactInfo则仅提供采用 a 的构造函数,ContactInfo如果ContactInfo为 null,则应抛出ArgumentNullException

于 2013-05-08T20:57:45.343 回答