【问题标题】:Porting C++ Code to C# - Pointer Issue将 C++ 代码移植到 C# - 指针问题
【发布时间】:2013-10-13 15:48:18
【问题描述】:

我正在尝试将 C++ 代码转换为 C#。我们有在 C++ 中接受指针的函数。 在 C# 中,我们在做这件事时遇到了麻烦。 我们尝试了以下演示代码:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test obj = new Test();
            int a,b;
            Console.WriteLine("Initial Values");
            a = 20;
            b = 100;
            obj.SetRef(ref a,ref b);
            Console.WriteLine("Value of A: " + a);
            Console.WriteLine("Value of B: " + b);
            obj.SetValRef(ref a);
            Console.WriteLine("After Ref");
            Console.WriteLine("Value of A: " + a);
            Console.WriteLine("Value of B: " + b);
            Console.ReadKey();
        }   
    }



    class Test
    {

        public void SetRef(ref int x, ref int y)
        {
            y = x;
        }

        public void SetValOut(out int x)
        {
            x = 10;

        }

        public void SetValRef(ref int x)
        {
            x = 10;

        }
    }
}

当我们运行它时,输出是

Initial Values
Value of A: 20
Value of B: 20
After Ref
Value of A: 10
Value of B: 20

我们希望如果一个变量的值发生变化,那么第二个变量的值应该自动变化(指针)。

【问题讨论】:

  • 第一:为什么不使用包装器为 C++ 代码提供 C# 接口?第二:考虑发出信号。
  • 包装器有什么帮助?问题仅在于此处的参考变量..
  • @NewtonSheikh 因为他不必将 C++ 代码转换为 C#(虽然我不知道原因)

标签: c# pointers out ref


【解决方案1】:

在 C#/.NET 中执行此操作的唯一方法是使用不安全代码并将其中一个变量声明为指针。

但是,这对 C# 代码来说不是一个好的建议。我会高度考虑将代码重组为更像 C#,否则您将与该语言作斗争。

或者,一个更好的建议是,使用托管 C++ 编译器编译代码并将其包装成一些不错的真实托管类型,而不是经历移植的麻烦?

无论如何,这里有一个 LINQPad 示例,但是,它显示了如果您真的必须移植它并需要该功能,该怎么做

void Main()
{
    unsafe
    {
        int x = 10;
        int* y = &x;

        Debug.WriteLine("x=" + x + ", y=" + *y);

        ChangeValue(ref x);

        Debug.WriteLine("x=" + x + ", y=" + *y);

        ChangeValue(ref *y);

        Debug.WriteLine("x=" + x + ", y=" + *y);
    }
}

static void ChangeValue(ref int value)
{
    value += 10;
}

这将输出:

x=10, y=10
x=20, y=20
x=30, y=30

【讨论】:

  • 那么你必须确保你也传递指针,或者使用引用传递。我已经编辑了代码。
  • 我们已经将所有代码移植到c#中。现在我们遇到了几个问题。这可能是由于指针转换。我们将尝试使用包装类。感谢您的帮助。
【解决方案2】:

您可以在 c# 上使用“指针”

使用“不安全”关键字,并更改编译器选项以允许不安全代码

'ref' 不适合它

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多