我有以下课程:
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);
答案 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
。