我认为我误解了获得的目的;组;在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)));
}
}
答案 0 :(得分:11)
您需要 初始化/实例化 您的列表。
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时很少使用setter。 “Lazy Load”更常见的是List / Collection:
public List<double> _newData;
public List<double> NewData
{
get
{
if(_newData == null)
_newData = new List<double>();
return _newData;
}
}
答案 1 :(得分: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方法,具体取决于您对输入数据的信心。
答案 2 :(得分:0)
自动属性使用该数据类型的默认值初始化该属性,并且所有引用类型的默认值均为null。因此,除非您为其分配内容,否则NewData属性的值基本上为null。对于集合,我宁愿只在你的情况下制作一个get访问器,也不需要setter。 所以我的财产看起来像:
private List<double> newData = new List<double>();
public List<double> NewData
{
get{return newDate;}
}