2012-08-28 24 views
1

我有以下类:我是否需要用c#中的新进行初始化列表?

public class CityDetailViewModel 
{ 
    public IEnumerable<City.Grid> 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<long>(); 
     var sw = Stopwatch.StartNew(); 
     var vm = new CityDetailViewModel(); 

我想把变量毫秒到我CityDetailViewModel类。

public class CityDetailViewModel 
{ 
    public IEnumerable<City.Grid> Detail { get; set; } 
    public SelectList Statuses { get; set; } 
    public string Topics { get; set; } 
    public SelectList Types { get; set; } 
    public List<long> MS { get; set; } 
} 

这是正确的做法。我不确定,但是我需要使用“新”。此外,在我的代码添加到列表中使用:

ms.Add(sw.ElapsedMilliseconds); 

如果是CityDetailViewModel的一部分,但我还是能做到这一点使用:

MS.Add(sw.ElapsedMilliseconds); 
+0

为了提高可读性,您的示例(和代码)可以从一些更详细的变量名称中受益 –

回答

5

当您创建的CityDetailViewModel一个新的实例,成员MSnull,因此 呼吁Add它会提高一个NullReferenceException

您可以创建一个新List<long>里面的类的构造函数,或者创建

public class CityDetailViewModel 
{ 
    ... 

    public CityDetailViewModel() 
    { 
     this.MS = new List<long>(); 
    } 
} 

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<long>(); 
    var sw = Stopwatch.StartNew(); 
    var vm = new CityDetailViewModel() { MS = ms }; 
    ... 
    ms.Add(sw.ElapsedMilliseconds); 

因为msvm.MS将是相同的列表实例的一个新的外这里。

2

如果不初始化列表,它会是null,并试图拨打Add就会导致NullReferenceException

3

是的,你需要初始化你的列表 - 使用这些自动属性我建议在构造函数中做这个。通过这种方式,您可以制作set -ter列表private,因为没有人应该能够从班级外部重新初始化列表。

2

是的,你可以通过这种方式访问​​MS属性。

你需要注意的是MS列表的初始化。所以在列表初始化到模型构造函数。否则,你将得到NullReferenceExceptions。

我假设你正在用你的数据源数据填充Detail和其他SelectLists,而不是在没有初始化的情况下直接访问它们。

public class CityDetailViewModel 
{ 
    public IEnumerable<City.Grid> Detail { get; set; } 
    public SelectList Statuses { get; set; } 
    public string Topics { get; set; } 
    public SelectList Types { get; set; } 
    public List<long> MS { get; set; } 

    public CityDetailViewModel() 
    { 
     MS = new List<long>(); 
    } 
} 

您必须在构造函数中执行此操作的原因是您正在使用自动属性。如果使用支持属性,则可以在构造函数外部初始化属性。

像这样

public class CityDetailViewModel 
{ 
    public IEnumerable<City.Grid> Detail { get; set; } 
    public SelectList Statuses { get; set; } 
    public string Topics { get; set; } 
    public SelectList Types { get; set; } 
    private List<long> _ms = new List<long>(); 
    public List<long> MS { 
     get { return _ms; } 
     set { _ms = value; } 
    } 
} 
0

尝试CityDetailViewModel像这样一个构造函数扩展:

public class CityDetailViewModel 
{ 
    public IEnumerable<City.Grid> Detail { get; set; } 
    public SelectList Statuses { get; set; } 
    public string Topics { get; set; } 
    public SelectList Types { get; set; } 
    public List<long> MS { get; set; } 

    public CityDetailViewModel(){ 
     MS = new List<long>(); 
    } 
} 

然后,你可以做

public ActionResult getGrid(string pk, string rk) { 
    var vm = new CityDetailViewModel(); 
    var sw = Stopwatch.StartNew(); 
    vm.MS.Add(sw); 
} 
0

的getGrid方法中的初始化,可以实现通过将ms变量传递给CityDetailViewModel

public ActionResult getGrid(string pk, string rk) { 
    var ms = new List<long>(); 
    var sw = Stopwatch.StartNew(); 
    var vm = new CityDetailViewModel { MS = ms }; 

MS确实需要传递在其他明智的vm.MS.Add(sw.ElapsedMilliseconds)通话将导致NullReferenceException之前实例化。