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

时间:2013-10-07 06:48:29

标签: c# pointers out ref

我试图将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

我们希望如果一个变量的值被改变,那么second的值应该自动改变(指针)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

您可以在c#

上使用“指针”

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

'ref'不适合它