通过引用传递c#struct?

jav*_*red 30 c#

在我的c#应用程序中,我在callback/delegate中收到指向c ++ struct的指针.我不确定是否class可以做到这一点,但只是将c ++指针转换为适当的c#struct工作正常,所以我使用c#struct来存储数据.

现在我想传递对struct的引用以进行进一步处理

  • 我无法使用,class因为它可能不会完美地"映射"到c ++ struct.
  • 我不想复制struct以获得更好的延迟

我怎样才能做到这一点?


此示例演示struct是按值传递的,而不是通过引用传递的:

using System;

namespace TestStruct
{
    struct s
    {
        public int a;
    }

    class Program
    {
        static void Main(string[] args)
        {
            s s1 = new s
                       {
                           a = 1
                       };
            Foo(s1);
            Console.WriteLine("outer a = " + s1.a);
        }

        private static void Foo(s s1)
        {
            s1.a++;
            Console.WriteLine("inner a = " + s1.a);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

inner a = 2
outer a = 1
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 49

听起来你只想ref通过引用来传递结构:

private static void Foo(ref s s1)
{
    s1.a++;
    Console.WriteLine("inner a = " + s1.a);
}
Run Code Online (Sandbox Code Playgroud)

在通话现场:

Foo(ref s1);
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅我在C#中传递参数的文章.

请注意,除了互操作之外,我通常强烈建议不要使用像这样的可变结构.我可以理解这里的好处.

  • +1.旁注:代码处理`struct`必须非常谨慎地编写,因为几乎所有使用`struct`的操作都会创建副本(除了数组,你仍然可以使用一个元素的`ref`). (9认同)
  • 为什么强烈建议不要通过`ref`传递结构?据我所知,它与在C++中通过引用传递相同(例如``std :: string&`),它可以消除对可能的大型结构的不必要的复制. (2认同)