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。したがって、そのインスタンスを呼び出すと、が発生AddNullReferenceExceptionます。

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が発生します。

詳細リストやその他の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 に答える