C#:如何 return 对结构的可选引用
C#: How to return optional ref to struct
在 C# 中,我如何编写一个可能 return 对结构的引用的函数?
我基本上想要的是 return 类型 Nullable<ref OutboxSlot>
,但编译器抱怨 ref
收到意外标记。
我想做的是这样的:
Nullable<ref SomeFieldStruct> GetCorrectField(ref SomeStruct s) {
// Depending on some property of s either return null or a ref to a field of s
}
在像 Rust 这样的东西中,我可以很容易地声明一个 return 类型,比如 Option<&mut SomeFieldStruct>
。
PS:不,我不能使用 类。
在项目属性中,在编译中,必须勾选“允许不安全代码”:
不要忘记在 Debug 和 Release 中设置。
我将使用这个结构:
public struct SomeStruct
{
public int Value;
public SomeFieldStruct Field;
}
public struct SomeFieldStruct
{
public double Value;
}
然后,创建您的方法:
public unsafe static SomeFieldStruct* GetCorrectField(ref SomeStruct s)
{
// Depending on some property of s either return null or a ref to a field of s
if (s.Value == 0)
{
fixed (SomeFieldStruct* field = &s.Field)
{
return field;
}
}
return null;
}
如果值为零,则您 return 您的结构的字段 属性 的地址。检查一下:
public unsafe static void Test()
{
SomeStruct obj;
obj.Value = 0;
obj.Field.Value = 1.2;
SomeFieldStruct* field = GetCorrectField(ref obj);
if (field != null)
{
field->Value *= 10.0;
}
}
对于指针,必须使用箭头 -> 而不是点。您所有的不安全方法都必须包含不安全关键字。
在 C# 中,我如何编写一个可能 return 对结构的引用的函数?
我基本上想要的是 return 类型 Nullable<ref OutboxSlot>
,但编译器抱怨 ref
收到意外标记。
我想做的是这样的:
Nullable<ref SomeFieldStruct> GetCorrectField(ref SomeStruct s) {
// Depending on some property of s either return null or a ref to a field of s
}
在像 Rust 这样的东西中,我可以很容易地声明一个 return 类型,比如 Option<&mut SomeFieldStruct>
。
PS:不,我不能使用 类。
在项目属性中,在编译中,必须勾选“允许不安全代码”:
不要忘记在 Debug 和 Release 中设置。
我将使用这个结构:
public struct SomeStruct
{
public int Value;
public SomeFieldStruct Field;
}
public struct SomeFieldStruct
{
public double Value;
}
然后,创建您的方法:
public unsafe static SomeFieldStruct* GetCorrectField(ref SomeStruct s)
{
// Depending on some property of s either return null or a ref to a field of s
if (s.Value == 0)
{
fixed (SomeFieldStruct* field = &s.Field)
{
return field;
}
}
return null;
}
如果值为零,则您 return 您的结构的字段 属性 的地址。检查一下:
public unsafe static void Test()
{
SomeStruct obj;
obj.Value = 0;
obj.Field.Value = 1.2;
SomeFieldStruct* field = GetCorrectField(ref obj);
if (field != null)
{
field->Value *= 10.0;
}
}
对于指针,必须使用箭头 -> 而不是点。您所有的不安全方法都必须包含不安全关键字。