C# 为什么我们需要创建Icollection类型属性的新instence

C# 为什么我们需要创建Icollection类型属性的新instence,c#,C#,我的类中有几个属性是ICollection类型的。当我试图在这些属性中添加任何数据而不创建它们的新实例时,编译器会向我发出一个错误,说我需要创建它们的实例。我的问题是,当我创建一个类的新实例时,我会间接地为整个类创建一个新内存,而这些属性(ICollection类型)都在类内部,那么为什么我需要为这些属性创建新实例呢 public class User { public string UserId { get; set; } public ICollection<Addre

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

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();
    }
}
公共类用户
{
公共字符串用户标识{get;set;}
公共ICollection地址{get;set;}
公共ICollection联系人{get;set;}
}
公共课堂演讲
{
公共字符串地址ID{get;set;}
}
公共类联系人
{
公共字符串ContactId{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
用户=新用户();
user.Contacts=new Collection(){new Contact(){};
user.Addresses.Add(新地址()
{
});//抛出错误
Console.ReadKey();
}
}

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


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

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

public User() {
    this.Addresses = new List<Address>();
    this.Contacts = new List<Contact>();
}
为了避免出现
NullReferenceException
的问题,您需要在创建新对象时实例化所有这些属性

public User() {
    this.Addresses = new List<Address>();
    this.Contacts = new List<Contact>();
}
公共用户(){
this.Addresses=新列表();
this.Contacts=新列表();
}
在构造函数中使用它,您将能够向这些集合添加项,而无需在对象外部实例化它们