2012-08-28 57 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之前實例化。