我是否需要使用c#中的new来初始化列表?

时间:2012-08-28 09:59:24

标签: 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();

我想将变量ms放入我的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);

6 个答案:

答案 0 :(得分:5)

当您创建CityDetailViewModel的新实例时,成员MS将为null,因此 在其上调用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);

ms

因为此处vm.MS和{{1}}将是相同的列表实例。

答案 1 :(得分:3)

是的,您需要初始化列表 - 使用这些自动属性我建议在构造函数中执行此操作。这样您就可以制作列表set的{​​{1}} - ,因为没有人能够从您的课堂外重新初始化列表。

答案 2 :(得分:2)

如果您未初始化列表,则该列表将为null,并且尝试在其上调用Add将会生成NullReferenceException

答案 3 :(得分:2)

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

您需要注意的是MS List的初始化。所以在列表初始化到模型构造函数。否则你将获得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; }
    }
}

答案 4 :(得分:0)

尝试使用这样的ctor扩展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);
}

答案 5 :(得分: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