常量结构的C#列表

本文关键字:列表 结构 常量 | 更新日期: 2023-09-27 18:27:32

我想创建一个可以从其他类引用的查找表,所以我正在尝试创建一个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"answers"return Fieldbus"后面突出显示"{"之间切换,因此它显然进入了一个无限循环。

你知道我做错了什么吗?

常量结构的C#列表

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

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

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

如果一个结构的目的是封装一个固定的自变量集合,那么直接公开字段就可以更简洁地定义一个结构,如果它公开了属性,就可以用完全相同的方式做所有可以做的事情。此外,结果结构的类型的存储位置在完全相同的情况下是可变的,就像将其字段封装在只读属性中一样;主要的语义差异是,公开的字段结构将允许以线程安全的方式高效地完成某些事情,而所谓的不可变结构只允许以低效和非线程安全的形式完成。允许通过方法进行突变的结构方法处理不当,这一事实导致了"可变结构是邪恶的"的宣告,尽管与结构突变方法相关的问题不会发生在公开的结构字段中。

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