C#const结构列表

时间:2013-08-13 09:36:18

标签: c# list struct const

我想创建一个可以从其他类引用的查找表,所以我试图创建一个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 个答案:

答案 0 :(得分:5)

您需要返回私有备份变量this.prvFieldbus。您的其他财产也是如此。

答案 1 :(得分:2)

public bool Fieldbus { get { return prvFieldbus; } }

答案 2 :(得分:0)

public bool Fieldbus { get { return Fieldbus; } }

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

答案 3 :(得分:0)

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

其他人已经注意到您的情况下的问题是由于在需要支持字段名称时使用了struct属性名称。当然,纠正这将使您的代码工作。但是,我建议避免此类问题的最简单方法是让struct使用公共字段来封装其状态。这样做会使结构定义的长度减半,允许一目了然地看到它的语义,并消除一个结构看起来像是按照你想要的模式实际做其他事情的可能性。