没有装箱的指针管理结构?

时间:2014-12-29 11:02:56

标签: c# pointers struct

我们说我的结构不是C#原语之一。

我想知道是否有方法(包括不安全的代码)从结构类型的实例中获取指针(指针不必是类型安全的,它可能是void*)并从指针获取结构类型的实例,但不涉及拳击。

(我知道System.Runtime.InteropServices.Marshal类几乎提供了我所描述的内容,但它涉及传递和获取结构object,这意味着涉及拳击。)

2 个答案:

答案 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 进行编译。