【问题标题】:C# list of const structC# const 结构列表
【发布时间】:2013-08-14 20:38:28
【问题描述】:

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

任何想法我做错了什么?

【问题讨论】:

  • 它自己返回了......

标签: c# list struct constants


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    public bool Fieldbus { get { return prvFieldbus; } }
    

    【讨论】:

      【解决方案3】:
      public bool Fieldbus { get { return Fieldbus; } }
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-03-06
          • 1970-01-01
          • 2015-06-07
          • 2013-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-14
          相关资源
          最近更新 更多