4

我想创建一个可以从其他类引用的查找表,所以我试图创建一个 const 结构列表,如下所示:

    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”之后突出显示“{”之间的步进切换,因此它显然进入了无限循环。

任何想法我做错了什么?

4

4 回答 4

5

您需要返回您的私有备份变量this.prvFieldbus。这也适用于您的其他属性。

于 2013-08-13T09:38:39.937 回答
2
public bool Fieldbus { get { return prvFieldbus; } }
于 2013-08-13T09:38:40.550 回答
0
public bool Fieldbus { get { return Fieldbus; } }

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

于 2013-08-13T09:48:31.247 回答
0

如果结构的目的是封装一个固定的自变量集合,那么简单地直接暴露字段将允许人们更简洁地定义一个结构,该结构将允许人们可以做任何事情,如果它暴露了属性,就可以做同样的事情方法。此外,结果结构类型的存储位置将在与将其字段包装在只读属性中的情况完全相同的情况下是可变的;主要的语义差异是暴露字段结构将允许以线程安全的方式有效地完成某些事情,而所谓的不可变结构只允许以低效和非线程安全的方式完成。允许通过方法进行突变的结构方法处理不当这一事实导致了一个声明,即“

其他人已经注意到,您的问题是由于在需要支持字段名称时使用了结构属性名称。当然更正这将使您的代码正常工作。但是,我建议避免此类问题的最简单方法是让结构使用公共字段来封装其状态。这样做可以将结构定义的长度减半,使其语义一目了然,并消除了乍一看似乎遵循您预期模式的结构实际上执行其他操作的可能性。

于 2013-08-13T16:59:50.950 回答