1

我有以下课程:

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);
4

6 回答 6

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);

因为msvm.MS将是相同的列表实例。

于 2012-08-28T10:04:42.500 回答
3

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

于 2012-08-28T10:03:43.637 回答
2

如果您不初始化列表,它将是null,并且尝试调用Add它会导致NullReferenceException.

于 2012-08-28T10:02:51.930 回答
2

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

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

我假设您正在使用数据源数据填充 Detail 和其他 SelectList,并且在没有初始化的情况下也不会直接访问它们。

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; }
    }
}
于 2012-08-28T10:08:46.893 回答
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);
}
于 2012-08-28T10:11:15.467 回答
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.

于 2012-08-28T10:13:26.027 回答