2013-10-07 88 views
0

我试图将C++代码转换为C#。我们有接受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 

我们想,如果一个变量的值被改变,那么第二次的值应该自动更改(三分球)。

+0

第一:为什么不使用包装来给C++代码提供一个C#接口?第二:考虑发射信号。 – fiscblog

+0

包装器如何帮助?问题是只有在这里的参考变量.. –

+0

@NewtonSheikh因为他不必将C++代码转换为C#(尽管我不知道原因) – fiscblog

回答

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 
+0

然后,你必须确保你也传递指针,或者使用参考通过。我编辑了代码。 –

+0

我们已经将所有代码移植到了c#中。现在我们遇到了一些问题。这可能是由于指针转换。我们将尝试使用包装类。谢谢您的帮助。 –

-1

你可以使用c#上的'指针'

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

'ref'不适合它