是否有一个工作替代if(struct == null)

本文关键字:struct null if 有一个 工作 是否 | 更新日期: 2023-09-27 18:12:26

我试图检查是否从数组结构体已被分配,我不能检查它或它的数据为null。我能查一下是否已经分配了吗?

结构:

    [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;
    }

是否有一个工作替代if(struct == null)

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

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

如果不希望扩展结构体,或者用nullable<struct>替换它,并且希望像示例中那样保留结构体数组,那么最简单的解决方法是将此信息保存在单独的bool数组中:
bool[] screenbufferIsAssigned = new bool[screenbuffer.Length];

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

在下面的代码中,我们创建并实现了一个implicit boolean operator,它处理一种方法来确定struct是否已经初始化(struct绝不是 null,因为它们是值类型)。然而,它们的成员可以是null)。

struct Foo
{
    float x;
    public static implicit operator bool(Foo x)
    {
        return !x.Equals(default(Foo));
    }
}

注意:这将返回一个假阴性当x == 0。记住这一点,你可以根据你的具体需要创造性地编写一个变通方法。

最简单的工作是创建一个虚拟类(例如nullable),在struct的构造函数中初始化,并确保始终通过使用构造函数初始化所述struct:
public class nullable{}
struct Foo
{
    nullable n;
    float x;
    public Foo(float x)
    {
        this.x = x;
        this.n = new nullable();
    }
    public static implicit operator bool(Foo x)
    {
        return !x.Equals(default(Foo));
    }
}

用法:

if(mFoo)
{
    //Do something
}