我是否需要使用c#中的new来初始化列表?
我有以下课程:
public class CityDetailViewModel { public IEnumerable Detail { get; set; } public SelectList Statuses { get; set; } public string Topics { get; set; } public SelectList Types { get; set; } }
在我的代码中,我有:
public ActionResult getGrid(string pk, string rk) { var ms = new List(); var sw = Stopwatch.StartNew(); var vm = new CityDetailViewModel();
我想将变量ms放入我的CityDetailViewModel类中。
public class CityDetailViewModel { public IEnumerable Detail { get; set; } public SelectList Statuses { get; set; } public string Topics { get; set; } public SelectList Types { get; set; } public List MS { get; set; } }
这是正确的方法吗? 我不确定,但我需要使用“新”。 同样在我的代码中我使用以下命令添加到列表:
ms.Add(sw.ElapsedMilliseconds);
如果它是CityDetailViewModel的一部分,我仍然可以使用:
MS.Add(sw.ElapsedMilliseconds);
当您创建CityDetailViewModel
的新实例时,成员MS
将为null
,因此在其上调用Add
将引发NullReferenceException
。
您可以在类的构造函数中创建一个新的List
,也可以在其外部创建一个新的List
public class CityDetailViewModel { ... public CityDetailViewModel() { this.MS = new List(); } } public ActionResult getGrid(string pk, string rk) { var sw = Stopwatch.StartNew(); var vm = new CityDetailViewModel(); ... vm.MS.Add(sw.ElapsedMilliseconds);
要么
public ActionResult getGrid(string pk, string rk) { var ms = new List(); var sw = Stopwatch.StartNew(); var vm = new CityDetailViewModel() { MS = ms }; ... ms.Add(sw.ElapsedMilliseconds);
因为ms
和vm.MS
在这里将是相同的列表实例。
是的,您需要初始化列表 – 使用这些自动属性我建议在构造函数中执行此操作。 这样,您可以将列表的set
-ter set
private
因为没有人能够从您的类外部重新初始化列表。
如果您没有初始化列表,它将为null
,并且尝试在其上调用Add
将导致NullReferenceException
。
是的,您可以通过这种方式访问MS属性。
您需要注意的是MS List的初始化。 所以在列表初始化到模型构造函数。 否则你将获得NullReferenceExceptions。
我假设您使用数据源数据填充Detail和其他SelectLists,而不是在没有初始化的情况下直接访问它们。
public class CityDetailViewModel { public IEnumerable Detail { get; set; } public SelectList Statuses { get; set; } public string Topics { get; set; } public SelectList Types { get; set; } public List MS { get; set; } public CityDetailViewModel() { MS = new List (); } }
您必须在构造函数中执行此操作的原因是您正在使用自动属性。 如果您使用支持属性,则可以在构造函数外部初始化该属性。
像这样
public class CityDetailViewModel { public IEnumerable Detail { get; set; } public SelectList Statuses { get; set; } public string Topics { get; set; } public SelectList Types { get; set; } private List _ms = new List (); public List MS { get { return _ms; } set { _ms = value; } } }
可以通过将ms变量传递到CityDetailViewModel来实现getGrid方法中的初始化
public ActionResult getGrid(string pk, string rk) { var ms = new List(); var sw = Stopwatch.StartNew(); var vm = new CityDetailViewModel { MS = ms };
ms确实需要在传递之前进行实例化, vm.MS.Add(sw.ElapsedMilliseconds)
调用vm.MS.Add(sw.ElapsedMilliseconds)
将导致NullReferenceException
。
尝试使用这样的ctor扩展CityDetailViewModel:
public class CityDetailViewModel { public IEnumerable Detail { get; set; } public SelectList Statuses { get; set; } public string Topics { get; set; } public SelectList Types { get; set; } public List MS { get; set; } public CityDetailViewModel (){ MS = new List (); } }
那你可以做
public ActionResult getGrid(string pk, string rk) { var vm = new CityDetailViewModel(); var sw = Stopwatch.StartNew(); vm.MS.Add(sw); }