C# &引用;“未设置对象引用”;错误
我在下一个方法中出现错误“对象引用未设置为对象的实例”:C# &引用;“未设置对象引用”;错误,c#,.net,C#,.net,我在下一个方法中出现错误“对象引用未设置为对象的实例”: private void alSave_Click(object sender, EventArgs e) { _alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema); } 我不知道我能做什么。。。 代码如下: private string alFile = @".\alRecord.xml";
private void alSave_Click(object sender, EventArgs e)
{
_alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
我不知道我能做什么。。。
代码如下:
private string alFile = @".\alRecord.xml";
public DataTable _alRecord;
private DataTable alRecord
{
get
{
if (_alRecord == null)
{
_alRecord = new DataTable();
if (File.Exists(alFile))
{ _alRecord.ReadXml(alFile); }
else
{ InitDataTable2(_alRecord); }
}
return _alRecord;
}
}
private void InitDataTable2(DataTable table)
{
table.TableName = "AlTable";
table.Columns.Add("ID", typeof(int));
table.Columns.Add("sun", typeof(bool));
table.Columns.Add("mon", typeof(bool));
table.Columns.Add("tue", typeof(bool));
table.Columns.Add("wed", typeof(bool));
table.Columns.Add("thu", typeof(bool));
table.Columns.Add("fri", typeof(bool));
table.Columns.Add("sat", typeof(bool));
table.Columns.Add("doors", typeof(string));
table.Columns.Add("from1", typeof(DateTime));
table.Columns.Add("to1", typeof(DateTime));
table.Columns.Add("from2", typeof(DateTime));
table.Columns.Add("to1", typeof(DateTime));
for (int i = 0; i < 99; i++)
{
var row = alRecord.NewRow();
row["ID"] = i;
row["sun"] = false;
row["mon"] = false;
row["tue"] = false;
row["wed"] = false;
row["thu"] = false;
row["fri"] = false;
row["sat"] = false;
row["doors"] = "";
row["from1"] = "00:01";
row["to1"] = "23:59";
row["from2"] = "00:01";
row["to2"] = "23:59";
alRecord.Rows.Add(row);
}
}
private void alSave_Click(object sender, EventArgs e)
{
_alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
私有字符串alFile=@“\alRecord.xml”;
公共数据表ALU记录;
私有数据表记录
{
得到
{
如果(_alRecord==null)
{
_alRecord=新数据表();
if(File.Exists(alFile))
{{u alRecord.ReadXml(alFile);}
其他的
{InitDataTable2(_alRecord);}
}
返回所有记录;
}
}
私有void InitDataTable2(DataTable表)
{
table.TableName=“AlTable”;
表.列.添加(“ID”,类型(int));
表.列.添加(“sun”,类型(bool));
表.列.添加(“mon”,类型(bool));
表.列.添加(“tue”,类型(bool));
表.列.添加(“wed”,类型(bool));
表.列.添加(“thu”,类型(bool));
表.列.添加(“fri”,类型(bool));
表.列.添加(“sat”,类型(bool));
表.列.添加(“门”,类型(字符串));
表.Columns.Add(“from1”,typeof(DateTime));
table.Columns.Add(“to1”,typeof(DateTime));
表.Columns.Add(“from2”,typeof(DateTime));
table.Columns.Add(“to1”,typeof(DateTime));
对于(int i=0;i<99;i++)
{
var row=alRecord.NewRow();
行[“ID”]=i;
行[“sun”]=false;
行[“mon”]=false;
行[“tue”]=假;
行[“wed”]=假;
行[“thu”]=false;
行[“fri”]=假;
行[“sat”]=假;
行[“门”]=“”;
行[“from1”]=“00:01”;
行[“to1”]=“23:59”;
行[“from2”]=“00:01”;
行[“to2”]=“23:59”;
alRecord.Rows.Add(行);
}
}
私有void也保存单击(对象发送者,事件参数e)
{
_WriteXml(@“\alRecord.xml”,XmlWriteMode.WriteSchema);
}
\u alRecord
仅当您通过属性名称引用时才会加载,因此应将其写入:
private void alSave_Click(object sender, EventArgs e)
{
alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
编辑:
您正在使用一种称为惰性初始化的技术_在调用alRecord之前,不会分配alRecord 您的alSave_Click方法使用了错误的alRecord。。。它应该使用不带下划线前缀的。即
private void alSave_Click(object sender, EventArgs e)
{
alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
作为旁注,您的alReord声明的范围似乎是错误的(按照惯例)
编辑
顺便说一下,一旦分配了alRecord,理论上你可以直接使用它。然而,这违背了惰性初始化模式的目的
例如,以下方法也可以,但关键是您不想担心_alRecord是否已初始化,您只想使用它;如果它恰好是您第一次使用它,那么它将自动初始化
private void alSave_Click(object sender, EventArgs e)
{
alRecord;
_alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
+1:我真的希望在字段声明上有一个“property access only”修饰符。如果你删除了私有变量,那么你代码的其余部分就不会编译。(如果您在getter中引用属性,您将陷入一个无限循环)。您可能需要阅读自动实现的属性,以引用“当属性访问器中不需要额外逻辑时,自动实现的属性使属性声明更简洁。”尝试编译您的代码“名称“\u alRecord”在当前上下文中不存在”我已经编辑了我的帖子-你是对的。但是你应该一直使用该属性,而不是你的成员变量。这导致你的代码失败。。。
private void alSave_Click(object sender, EventArgs e)
{
alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}
public DataTable _alRecord; //Normally **private** members would have an underscore prefix
private DataTable alRecord //And public members would have no prefix.
private void alSave_Click(object sender, EventArgs e)
{
alRecord;
_alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);
}