2011-02-08 10 views
7

私は構造体のリストを持って、常にnullであるリスト構造体の項目の値が

public struct stock_Str 
{ 
    public String name; 
    public int quote ; 
    public int chenge; 
    public bool quote_a; 
    public bool chenge_a; 
    public int[] rate_alarm; 
    public int[] chenge_alarm; 
} 

私がやるリストに項目を追加する場合:

stock_Str str = new stock_Str(); 
str.name = tbStockName.Text; 
str.chenge_a = false; 
str.quote_a = false; 
str.quote = 0; 
str.chenge = 0; 
str.chenge_alarm = new int[2]; 
str.rate_alarm = new int[2]; 

for (int i = 0; i < 2; i++) 
{ 
    str.rate_alarm[i] = 0; 
    str.chenge_alarm[i] = 0; 
} 

_mainApp.user_stocks.Add(str); 

私の問題:

  1. (構造体の)リスト項目の値を変更しようとすると、変更されません!

  2. 2つのintの2つの配列は常にnullに設定されています。

どのように修正できますか?

+2

ここではクラスを使用する方が適切だろうと考えています –

+4

変更可能な構造体を必要としない(そしてまれにしか使用しない)場合は、何がうまくいかないのかという大きな例です。 – Botz3000

答えて

9

a:構造体ではいけません。 b:構造体の「値」は決してnullではありません。でもNullable<T>nullは、煙、鏡、誤報を伴う魔法のビットです。

問題が再現しました。

1:はい。これは、構造体にコピーセマンティクスがあるためです。あなたはコピー変更されている - ではない、同じ1

2:おそらく同じことを

ここでは、より適切な実装があります。私はそれがあなたの問題のほとんどを修正します想像:

public class Stock 
{ 
    public string Name {get;set;} 
    public int Quote {get;set;} 
    public int Chenge {get;set;} 
    public bool QuoteA {get;set;} 
    public bool ChengeA {get;set;} 
    public int[] RateAlarm {get;set;} 
    public int[] ChengeAlarm {get;set;} 
} 

私はそれが動的なコレクションである場合、私は例えば、リストを好むだろう、最後の2の意図が何であるかは不明だけど、個人的に

private List<int> rateAlarms; 
    public List<int> RateAlarms { 
     get { return rateAlarms ?? (rateAlarms = new List<int>()); } 
    } 
+0

最初にお礼、何をお勧めしますか?クラスの配列を使うか、ジェネリックリストを使う?基本的に私の株式は非常に動的です、私は頻繁に私はプロパティを追加して変更を削除する必要があることを意味します。 @Marc Gravell –

+0

"クラスの配列を使うか、ジェネリックリストを使う?"私は理解していない - どんな状況で?しかしどちらの方法でも、プロパティの追加と削除を削除することは問題ではありません... –

2

構造体は値型です。したがって、構造体は参照型を取得しないため、コピーのみを編集することはできません。

ここでもクラスを使用する必要があります。

関連する問題