为什么我们需要创建Icollection类型属性的新实例

时间:2015-03-21 13:52:45

标签: c#

我的课程中有几个ICollection类型的属性。当我尝试在这些属性中添加任何数据而不创建新的实例时,编译器会向我发出错误消息,说我需要创建它们的实例。我的问题是,当我创建一个类的新实例时,间接我为整个类创建一个新内存,那些属性(ICollection类型)在类中,所以为什么我需要为这些属性创建新实例。 / p>

public class User
{
    public string UserId { get; set; }
    public ICollection<Address> Addresses { get; set; }
    public ICollection<Contact> Contacts { get; set; }

}

public class Address
{
    public string AddressId { get; set; }

}

public class Contact
{
    public string ContactId { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        User user = new User();

        user.Contacts = new Collection<Contact>() {new Contact() {}};

        user.Addresses.Add(new Address()
        {
        });//Throws Error

        Console.ReadKey();
    }
}

2 个答案:

答案 0 :(得分:3)

因为ICollectioninterface,接口是reference types。这意味着通过创建变量,您没有创建实例。只有在您拨打new时才会发生这种情况。您只创建了对实例的引用。

默认情况下,引用为null,这意味着它未设置为任何特定实例。这就是为什么当您在未设置为实例的引用上调用方法时,您会获得NullReferenceException

答案 1 :(得分:1)

同意nvoigt在回答中所说的一切。当它们是新对象的属性时,所有引用类型属性(int,DateTime,string等除外)都默认为null

为了绕过NullReferenceException,您想要做的是在创建新对象时实例化所有这些属性。

public User() {
    this.Addresses = new List<Address>();
    this.Contacts = new List<Contact>();
}

在构造函数中使用它,您将能够向这些集合中添加项目,而无需在对象外部实例化它们。