【问题标题】:pass c# struct by reference?通过引用传递 c# 结构?
【发布时间】:2013-05-12 22:56:38
【问题描述】:

在我的 c# 应用程序中,我在回调/委托中接收到指向 c++ 结构的指针。我不确定class 是否可以解决问题,但只是将 c++ 指针转换为适当的 c# 结构可以正常工作,所以我使用 c# 结构来存储数据。

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

  • 我不能使用class,因为它可能不会完美地“映射”到 c++ 结构。
  • 我不想复制结构以获得更好的延迟

我该怎么做?


这个例子演示了结构是按值传递的,而不是按引用传递的:

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);
        }

    }
}

输出是:

inner a = 2
outer a = 1

【问题讨论】:

  • 注意你对结构的推理:C++ 中的struct 与类完全相同(除了默认可访问性),而在 C# 中它们完全不同 - 值和引用类型。您可能真的会更好地使用 C# 中的类 - 至少阅读并理解 struct 在 C# 中的行为方式。
  • 我的大量互操作类确实是类而不是结构。如果您正确设置了编组(并且通常默认编组有效),那么您可以使用一个类。如果有疑问,我会先尝试上课。

标签: c#


【解决方案1】:

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

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

在通话现场:

Foo(ref s1);

更多详情请查看我的article on parameter passing in C#

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

【讨论】:

  • +1。旁注:代码处理struct 必须非常小心地编写,因为几乎所有使用struct 的操作都会创建副本(数组除外,您仍然可以在其中获取元素的ref)。
  • 为什么强烈建议不要通过ref 传递结构?据我所知,这与在 C++ 中通过引用传递(例如std::string&)是一回事,它可以消除对潜在大型结构的不必要复制。
  • @cmbasnett:我强烈建议不要使用可变结构。通过 ref 传递结构是可以的,但是 a) 我一般建议不要使用大型结构; b) 我反对 mutable 结构(就像 Microsoft 设计指南一样),因为它们会引起许多意外。
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多