【问题标题】:Is there a working alternative to if(struct == null)?if(struct == null) 有替代方案吗?
【发布时间】:2015-09-13 00:30:02
【问题描述】:

我正在尝试检查是否已分配数组中的结构,我无法检查它或者它的数据是否为空。有没有办法检查它是否已经分配了?

结构:

    [StructLayout(LayoutKind.Explicit)]
    public struct CharInfo
    {
        [FieldOffset(0)]
        public CharUnion Char;
        [FieldOffset(2)]
        public short Attributes;
    }

方法

    public void render(){
        for (int i = 0; i < (width * height - 1); i++) {
            if (screenBuffer[i].Char.UnicodeChar != Convert.ToChar(" ")) {
                ScreenDriver.screenBuffer[i] = screenBuffer[i];
            }
        }
       // ScreenDriver.screenBuffer = screenBuffer;
    }

【问题讨论】:

标签: c# struct


【解决方案1】:

您可以将结构与其默认值进行比较:if (struct==default(CharInfo)。但是,这不能区分未初始化的结构和用零初始化的结构。这是因为没有未初始化的结构体之类的东西,结构体总是自动初始化的。

如果你可以扩展结构,你可以给它一个bool IsAssigned。默认初始化会将其设置为 false。另一种选择是将其包装在可为空的:
CharInfo?[] screenBufferWithNull = new CharInfo?[123];

如果不希望扩展结构或将其替换为nullable&lt;struct&gt;,并且您想像示例中那样保留一系列结构,最简单的解决方法是将此信息保存在单独的布尔数组中:bool[] screenbufferIsAssigned = new bool[screenbuffer.Length];

【讨论】:

  • 另一种选择是让枚举中的项目非常明确地不被初始化。例如 enum Test { NotIntialized = 0, Red, Green, Blue }。默认值为 0。
【解决方案2】:

结构不能为空,因为它们是值类型。相反,您可以使用 default(CharInfo) 将其与其默认值进行比较,或者创建一个 Nullable。

【讨论】:

  • 谢谢,但现在我遇到了一个新错误。 "错误 2 运算符 '!=' 不能应用于 'SharpTUI.Krn32.Kernal32.CharInfo' 和 'SharpTUI.Krn32.Kernal32.CharInfo' 类型的操作数"
  • 那是因为您需要为您的结构重载运算符,如本问题中所见stackoverflow.com/questions/15199026/…
猜你喜欢
  • 2011-01-24
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2021-12-03
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多