我的课程中有几个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();
}
}
答案 0 :(得分:3)
因为ICollection
是interface
,接口是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>();
}
在构造函数中使用它,您将能够向这些集合中添加项目,而无需在对象外部实例化它们。