我是否需要使用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); 

因为msvm.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); }