【问题标题】:Not understanding why I must instantiate the class?不明白为什么我必须实例化这个类?
【发布时间】:2013-04-20 08:49:00
【问题描述】:

我有一个实体:

public virtual int RecommendedUserId { get; set; }
public virtual string Firstname { get; set; }
public virtual string Surname { get; set; }
public virtual string Email { get; set; }
public virtual string JobTitle { get; set; }
public virtual DateTime? DateAndTimeProcessed { get; set; }
public virtual DateTime? DateAndTimeRecommended { get; set; }
public virtual string ReasonForRejection { get; set; }

//  User also an entity and has property UserId
public virtual User RecommendedByUser { get; set; }
public virtual User AssignedToUser { get; set; }

在我的控制器中我有:

   Entities.RecommendedUser user = new RecommendedUser();
   user.Firstname = model.Firstname;
   user.Surname = model.Surname;
   user.Email = model.Email;
   user.JobTitle = model.JobTitle;

   // why am i getting the Object reference not set to 
   // an instance of an object error??
   user.RecommendedByUser.UserId = CurrentUser.UserId;  

如果我实例化RecommendedUser,我不也在RecommendedUser 内实例化User 吗??

【问题讨论】:

  • 不,每个对象都必须实例化。或者,RecommendedUser() 的默认构造函数必须以某种方式创建一个新的 RecommendedByUser()。

标签: c# reference


【解决方案1】:

您应该始终首先检查空值 喜欢:

if(user.Firstname != null)
{
  user.Firstname = model.Firstname;
}

避免空指针异常

【讨论】:

  • 在你的例子中,它是没用的。更像:if(user != null && model != null) user.FirstName = model.FirstName;
【解决方案2】:

对于 EntityFramework,有延迟加载功能。在您的特定情况下不适用,因为 EF 上下文未跟踪您的对象。延迟加载(然后是自动实例化)仅在您的对象被跟踪时才处于活动状态。

This thread 可能具有指导意义。

【讨论】:

    【解决方案3】:

    值类型由类初始化。但是子对象可以是NULL,因为它们是引用类型。这些对象需要先初始化,然后才能分配给属性。

    我假设您正在使用像实体框架这样的技术。像这样的框架允许您预取这些对象,以便在您从数据源获取实体时获取(并初始化)它们。但是,在创建新对象时,您需要自己创建它们。

    【讨论】:

      【解决方案4】:

      您没有实例化userRecommendedByUser;您只是在实例化user

         user.Firstname = model.Firstname;
         user.Surname = model.Surname;
         user.Email = model.Email;
         user.JobTitle = model.JobTitle;
         user.RecommendedByUser = new RecommendedUser(); // or whatever the exact type is, maybe just User
         user.RecommendedByUser.UserId = CurrentUser.UserId; 
      

      【讨论】:

      • RecommendedByUser 的类型为 User
      • 我认为他知道如何实例化它,问题是他为什么需要
      • @Corak 但 RecommendedUser 有一个名为 RecommendedByUser 的属性,该属性未被实例化。
      • @daryal - RecommendedUser 有一个名为 RecommendedByUser 的属性,其类型为 User。 (public virtual User RecommendedByUser { get; set; })
      • @Corak 和我写的一样吗?
      猜你喜欢
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2020-07-22
      • 2013-07-23
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多