2

get の目的を誤解していると思います。設定; C#で。入力しようとしている double のリストがあり、次のコードを使用しています...これらは両方とも同じクラスにあり、これを実行しようとすると、リストに入力しようとすると Null 参照例外が発生します. 私は正確に何を誤解していますか?

public List<double> NewData
{ get; set; }

public InfoFile(String fileName, String groupName)
{

    this.group = groupName;
    test = File.ReadAllLines(fileName);
    FileInfo label = new FileInfo(fileName);
    this.name = Path.GetFileName(fileName);
    isDrawn = false;

    for (int t = 2; t < test.Length; t++)
    {
        NewData.Add(double.Parse(test[t].Substring(6, 4)));
    }
}
4

3 に答える 3

12

リストを初期化/インスタンス化する必要があります。

public List<double> NewData
{
    get;
    set;
}

public InfoFile(String fileName, String groupName)
{
    // initialize NewData to a new instance of List<double>
    NewData = new List<double>(); 

    this.group = groupName;
    test = File.ReadAllLines(fileName);
    FileInfo label = new FileInfo(fileName);
    this.name = Path.GetFileName(fileName);
    isDrawn = false;
    for (int t = 2; t < test.Length; t++)
    {
        NewData.Add(double.Parse(test[t].Substring(6, 4)));

    }

}

ドキュメント:

C# 3.0 以降では、プロパティ アクセサーに追加のロジックが必要ない場合、自動実装されたプロパティによってプロパティ宣言がより簡潔になります。また、クライアント コードでオブジェクトを作成できるようにします。次の例に示すようにプロパティを宣言すると、コンパイラは、プロパティの get および set アクセサーを介してのみアクセスできるプライベートな匿名バッキング フィールドを作成します。

http://msdn.microsoft.com/en-us/library/bb384054.aspx


OPへのコメントで@EricLippertが述べているように、シナリオによっては、リスト/コレクションを公開するときにセッターが使用されることはめったにありません。リスト/コレクションと言った「遅延ロード」の方が一般的です。

public List<double> _newData;
public List<double> NewData
{
    get
    {
        if(_newData == null)
            _newData = new List<double>();

        return _newData;
    }
}
于 2013-06-10T19:02:06.587 に答える
0

自動プロパティは、そのデータ型の既定値でプロパティを初期化し、すべての参照型の既定値は null です。基本的に、何かを割り当てない限り、NewData プロパティの値は null です。コレクションの場合、あなたの場合もセッターは必要ないので、むしろ get アクセサーのみを作成したいと思います。したがって、私のプロパティは次のようになります。

private List<double> newData = new List<double>();

public List<double> NewData { get{return newDate;} }

于 2013-06-10T19:09:00.900 に答える
0

次のことをしようとしているだけだと思いますか?

List<double> doubleList = new List<double>();
for (int t = 2; t < test.Length; t++)
{
    doubleList.Add(double.Parse(test[t].Substring(6, 4)));    
}

編集: 入力データの信頼度に応じて、TryParse と Parse メソッドの使用を検討することをお勧めします。

于 2013-06-10T19:05:01.833 に答える