c# - 应用程序起点上的 StackOverFlow

标签 c# .net datatable

我构建了一个程序,然后按下一个按钮,程序崩溃了。 这是按钮的代码:

            _alRecord.WriteXml(@".\alRecord.xml", XmlWriteMode.WriteSchema);

调试返回StackoverFlow(位置在注释中标出),这里是完整代码:

        private string alFile = @".\alRecord.xml";

    public DataTable alRecord;
    public DataTable _alRecord
    {
        get
        { //location of stackoverflow
            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);
    }

最佳答案

您正在从属性的 getter 内部调用您的属性:

public DataTable _alRecord
{
    get
    {
        if (_alRecord == null) // <= whoops

这会导致无限递归 - 调用属性的 getter 以查看它是否返回 null 调用属性的 getter 以查看它是否返回 null 调用属性的 getter ...

@Dave 在评论中提出了一个很好的观点——在 C# 中,通常使用命名约定,你的属性是 CasedLikeThis 和支持字段(属性实际存储其值的字段是_namedLikeThis。它更容易区分 - 您总是知道 _ 表示支持字段,反之亦然。

关于c# - 应用程序起点上的 StackOverFlow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487557/

相关文章:

c# - 尝试通过微软示例理解 MVVM

c# - ASP.NET MVC 5 是否与 WebMatrix SimpleMembershipProvider 不兼容?

c# - ref struct 中不能使用 Yield 关键字?

c# - 动态改变面板的大小

jsf - 从当前行数据表中获取 id 以链接 JSF Primefaces Java

c# - 将 ClipboardContentBinding 绑定(bind)到 DisplayMemberPath

c# - C# 中的可空值类型是 Int32 吗?真的是一个 Int32 -?

.net - 使用 POI 将 DOC 导出为 PDF

jsf - 传递 p :dataTable to JavaScript function in p:ajax oncomplete 的当前选定行

java - 使用 Spring boot 解析管道分隔文件