2

我认为我误解了获取的目的;放; 在 C# 中。我有一个要填充的双打列表,我正在使用以下代码...它们都在同一个类中,当我尝试运行它时,尝试填充列表时出现 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


根据您的情况,正如@EricLippert 在他对您的 OP 的评论中所述,在公开列表/集合时很少使用设置器。更常见的“延迟加载”说 List/Collection:

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

我相信您只是想执行以下操作?

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 回答
0

自动属性使用该数据类型的默认值初始化属性,并且所有引用类型的默认值为 null。所以基本上你的 NewData 属性的值是空的,除非你给它分配了一些东西。对于集合,我宁愿只做一个 get 访问器,因为在你的情况下也不需要 setter。所以我的财产看起来像:

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

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

于 2013-06-10T19:09:00.900 回答