Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“未设置对象引用”;错误_C#_.net - Fatal编程技术网

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); 
}