将C++代码移植到 C# - 指针问题

本文关键字:指针 问题 C++ 代码 | 更新日期: 2023-09-27 18:34:06

我正在尝试将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# - 指针问题

在 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# 上使用"指针"

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

"引用"不适合它