0

我正在尝试将 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

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

4

2 回答 2

4

在 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
于 2013-10-07T06:54:18.967 回答
-1

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

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

'ref' 不适合它

于 2013-10-07T06:56:37.557 回答