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