是否有一个工作替代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==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
}