我们说我的结构不是C#原语之一。
我想知道是否有方法(包括不安全的代码)从结构类型的实例中获取指针(指针不必是类型安全的,它可能是void*
)并从指针获取结构类型的实例,但不涉及拳击。
(我知道System.Runtime.InteropServices.Marshal
类几乎提供了我所描述的内容,但它涉及传递和获取结构object
,这意味着涉及拳击。)
答案 0 :(得分:4)
您可以使用unsafe
区域使用&
运算符获取指针,并使用*
运算符转换回类型。
public struct Foo
{
public int bar;
};
void Main()
{
var foo = new Foo();
foo.bar = 5;
unsafe
{
Foo * fooPtr = &foo;
Console.WriteLine("Foo address {0:X}", *fooPtr);
Foo anotherFoo = *fooPtr;
Console.WriteLine("Bar= {0}", anotherFoo.bar);
}
}
答案 1 :(得分:3)
我不太明白使用&
运算符获取结构地址有什么问题。如果你不知道,那就有address of operator。
例如:
struct Demo
{
public int SomeField;
}
internal static class Program
{
static Demo demo = new Demo { SomeField = 5 };
private static void Main()
{
Print();
}
public static unsafe void Print()
{
fixed (Demo* demop = &demo)
{
Console.WriteLine(demop->SomeField);
}
}
}
此代码不会封装结构,但需要 unsafe context 进行编译。