简单的OOP理解

时间:2012-08-25 11:26:22

标签: c# asp.net-mvc-3 oop

我有一个班级:

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模型......我们认为这些类的代码已被省略,因为我认为它与问题无关。

2 个答案:

答案 0 :(得分:8)

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

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

null

或者使用字段支持的属性而不是auto属性,并设置支持字段:

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

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

答案 1 :(得分:1)

只是为了增加拉力赛25人'考虑到以下删节版本,答案非常好(无论如何都是+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. _priority设为string.Empty,将TaskId设为0,将PriorityId设为0,将Description设为{{1} (如果没有声明值,如果引用,则所有内容都设置为null,如果数字为null,则结构设置为将其字段设置为0和{{1} }})。
  2. 如果0的构造函数主体已执行,请将null设置为TaskDiplayModel
  3. Description的构造函数体已执行,将string.Empty设置为TaskModifyModel
  4. 如果嵌套继承更复杂,那么等等。作为一项规则,你可以期待其中的一些优化,所以不要担心采取不同的方法来设置一个值是更快还是更慢 - 它不会,但除了在调试运行中。它确实解释了避免在构造函数中调用虚方法的规则 - 大多数时候我们不需要关心上面的排序,只是将构造函数视为一个单元,之后我们有一个完全构造的对象,但是如果您开始使用虚拟调用,则上述排序变得非常重要,因为在某一点PriorityId3,而在另一点PriorityId