C# 常量结构体列表

4

我希望创建一个查找表,可以从其他类中引用。因此,我正在尝试创建一个以下形式的常量结构列表:

    public struct DataRouting1
{
    public struct tParameters
    {
            private readonly bool prvFieldbus;
            private readonly int prvAddressMax;
            private readonly string prvTypeLabel;
            private readonly byte prvXTPtype;
            private readonly string prvPointLabel;
            private readonly int prvPointMin;
            private readonly int prvPointMax;
            private readonly int prvPointValue;
            private readonly int prvQuantityMax;

            public tParameters(bool Fieldbus, int AddressMax, string TypeLabel, byte XTPtype, string PointLabel, int PointMin, int PointMax, int PointValue, int QuantityMax)
            {
                this.prvFieldbus = Fieldbus;
                this.prvAddressMax = AddressMax;
                this.prvTypeLabel = TypeLabel;
                this.prvXTPtype = XTPtype;
                this.prvPointLabel = PointLabel;
                this.prvPointMin = PointMin;
                this.prvPointMax = PointMax;
                this.prvPointValue = PointValue;
                this.prvQuantityMax = QuantityMax;
            }
            public bool Fieldbus { get { return Fieldbus; } }
            public int AddressMax { get { return AddressMax; } }
            public string TypeLabel { get { return TypeLabel; } }
            public byte XTPtype { get { return XTPtype; } }
            public string PointLabel { get { return PointLabel; } }
            public int PointMin { get { return PointMin; } }
            public int PointMax { get { return PointMax; } }
            public int PointValue { get { return PointValue; } }
            public int QuantityMax { get { return QuantityMax; } }
    }
    public static readonly List<tParameters> Parameter = new List<tParameters>
    {

        new tParameters (true,  250,    "Fieldbus Digital Input",           0x80,   "Number",   1,      65535,  0,  255),
        new tParameters (true,  250,    "Fieldbus Digital Output",          0x81,   "Number",   1,      65535,  0,  255),
        new tParameters (true,  250,    "Fieldbus Input Register",          0x82,   "Number",   1,      65535,  0,  255),
              .
              .
              .
    };
}

我使用它如下所示:
    if (DataRouting1.Parameter[Index].Fieldbus == false)
      .
      .

这段代码可以正确编译,但运行时程序崩溃并报告内存溢出。我逐步跟踪代码发现,在执行以上一行代码时,程序调用了该行。

                public bool Fieldbus { get { return Fieldbus; } }

并且无限期地保留在那里。按下步进按钮会在“get”后面的“{”和“return Fieldbus”之间切换高亮显示,因此显然进入了一个无限循环。

有什么想法我做错了什么吗?


6
它正在返回它自己... - Stephen
4个回答

5

您需要返回您的私有备份变量this.prvFieldbus。对于您的其他属性也是如此。


2
public bool Fieldbus { get { return prvFieldbus; } }

0
public bool Fieldbus { get { return Fieldbus; } }

创建无限递归。 Fieldbus 返回 Fieldbus 返回 Fieldbus 等等,直到调用堆栈溢出。


0
如果结构的目的是封装一组独立变量的固定集合,直接暴露字段将允许更简洁地定义一个结构,它将允许以完全相同的方式执行公开属性所能做的一切。此外,结果结构类型的存储位置在与只读属性包装其字段的情况下将以完全相同的情况下可变;主要语义上的区别是,暴露的字段结构将允许以高效和线程安全的方式完成某些事情,而所谓的不可变结构只能以低效和非线程安全的方式完成。尽管具有允许通过方法进行突变的结构方法处理不佳的问题导致了“可变结构是邪恶的”的宣言,但与通过暴露结构字段产生的问题不同。
其他人指出,在你的情况中问题的根源是在需要后备字段名称时使用了结构属性名称。当然,纠正这个问题可以使你的代码正常工作。然而,我建议最简单的避免这类问题的方法是让结构使用公共字段来封装其状态。这样做将减半您的结构定义长度,使其语义一目了然,并消除一个乍一看像是遵循您预期模式的结构实际上做了其他事情的可能性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接