0

我有一堂课:

public class TaskDiplayModel
{
    public int taskId { get; set; }

    [DisplayName("Task Description")]
    public string description { get; set; }

    [DisplayName("Priority")]
    public string priority { get; set; }

    [DisplayName("State")]
    public string state { get; set; }

    [DisplayName("Due By")]
    public DateTime deadline { get; set; }

    [DisplayName("Created By")]
    public PersonObject created_by { get; set; }

    [DisplayName("Assigned To")]
    public PersonObject assigned_to { get; set; }

    [DisplayName("Category")]
    public string category { get; set; }

    [DisplayName("Sub Category")]
    public string subCategory { get; set; }

    [DisplayName("Created")]
    public DateTime createdDate { get; set; }

    [DisplayName("Updated")]
    public DateTime lastUpdatedDate { get; set; }

    [DisplayName("Updated By")]
    public PersonObject lastUpdatedBy { get; set; }    
}

然后我有另一个从这个类继承的类:

public class TaskModifyModel : TaskDiplayModel
{
    public int priorityId { get; set; }
    public int stateId { get; set; }
    public int categoryId { get; set; }
    public int subCategoryId { get; set; }

    public SelectList states { get; private set; }
    public SelectList priorities { get; private set; }
    public SelectList categories { get; private set; }
    public SelectList subCategories { get; private set; }

    public TaskModifyModel()
    {
        SetupReferenceData(0);
    }

    public TaskModifyModel(int taskId)
    {

        var taskService = new TaskService();
        var task = taskService.GetTask(taskId);
    }
}

在我的应用程序中,我创建了一个TaskModifyModel对象。但是,基类中的字符串字段是null. 我希望它们已经被创建并成为String.Empty. 但是当我尝试访问它们时出现异常。我错过了什么吗?

顺便说一句,这些是 MVC3 模型......并且类中的代码已被省略,因为我认为这与问题无关。

4

2 回答 2

8

在 .NET 中,字符串的默认值为null,而不是String.Empty,因此除非您将属性的值专门设置为String.Empty,否则它们将保持为null

假设您希望您的字符串属性默认为空字符串而不是 null,您通常可以通过在构造函数中设置它们来执行此操作:

public void TaskDiplayModel()
{
    description = String.Empty;
    priority = String.Empty;
    state = String.Empty;
}

或者通过使用字段支持属性而不是自动属性,并设置支持字段:

private string _description = String.Empty;

[DisplayName("Task Description")]
public string description
{
    get { return _description; }
    set { _description = value; }
}

就我个人而言,我通常使用第一个选项,在构造函数中进行,因为它的代码更少。

于 2012-08-25T11:42:07.657 回答
1

鉴于以下删节版本,只是为了添加到 rally25rs 的出色答案(无论如何我都 +1):

public class TaskDiplayModel
{
    private string _priority = string.Empty;
    public int TaskId { get; set; }
    public string Description { get; set; }
    public string Priority
    {
       get { return _priority; }
       set { _priority = value; }
    }
    public TaskDisplayMode()
    {
      Description = string.Empty;
    }
}
public class TaskModifyModel : TaskDisplayMode
{
  public int PriorityId { get; set; }
  public TaskModifyModel()
    :base()
  {
    PriorityId = 3;
  }
}

那么构建时的顺序TaskModifyModel如下:

  1. 设置_prioritystring.EmptyTaskIdto 0PriorityIdto0Descriptionto null(如果未指定值,则所有内容都设置为null如果引用,0如果是数字,并且结构设置为使其字段充满0and null)。
  2. 如果执行构造函数主体,TaskDiplayModel则设置Descriptionstring.Empty.
  3. 的构造函数主体TaskModifyModel被执行,设置PriorityId3.

如果嵌套继承更复杂,依此类推。作为一项规则,您可以期望其中的一些被优化,所以不要担心在如何设置值时采用不同的方法是更快还是更慢 - 它不会,除非在调试运行中。它确实解释了避免在构造函数中调用虚方法的规则——大多数时候我们不需要关心上面的顺序,只需将构造函数视为一个单元,之后我们就有一个完全构造的对象,但是如果你开始玩虚拟电话,那么上面的顺序就变得非常重要,因为一方面PriorityId0,另一方面是3

于 2012-08-25T14:51:52.010 回答