2013-05-17 137 views
23

在我的c#應用程序中,我收到指向回調/委託中的C++結構體的指針。我不知道如果class可以做的伎倆,但只是將C++指針轉換爲適當的c#結構工作正常,所以我使用c#結構來存儲數據。通過c#結構參考?

現在我想通過參考結構作進一步處理

  • 我不能使用class,因爲它可能不會「地圖」完美的C++結構。
  • 我不想更好的延遲複製結構

我怎麼能這樣做?


這個例子表明,結構是按值傳遞,而不是參考:

using System; 

namespace TestStruct 
{ 
    struct s 
    { 
     public int a; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      s s1 = new s 
         { 
          a = 1 
         }; 
      Foo(s1); 
      Console.WriteLine("outer a = " + s1.a); 
     } 

     private static void Foo(s s1) 
     { 
      s1.a++; 
      Console.WriteLine("inner a = " + s1.a); 
     } 

    } 
} 

輸出是:

inner a = 2 
outer a = 1 
+4

要小心你關於struct的結構:C++中的'struct'與class完全一樣(禁止默認的可訪問性),而在C#中它們完全不同 - 值和引用類型。機會是你真的會更好用C#中的類 - 至少讀和理解'struct'在C#中的行爲如何。 –

+0

大量的互操作類實際上是類而不是結構。如果您正確設置編組(並且通常默認編組工作),那麼您可以使用一個類。如果有疑問,我會先與班級一起嘗試。 –

回答

40

這聽起來像你只是想用ref傳遞結構參考:

private static void Foo(ref s s1) 
{ 
    s1.a++; 
    Console.WriteLine("inner a = " + s1.a); 
} 

,並在調用點:

Foo(ref s1); 

見我article on parameter passing in C#瞭解更多詳情。

請注意,除了interop之外,我通常會強烈推薦針對使用這樣的可變結構。我可以理解這裏的好處。

+8

+1。注意:必須非常小心地編寫代碼處理'struct',因爲幾乎所有使用'struct'的操作都會創建副本(數組除外,您仍然可以獲取元素的'ref')。 –

+0

爲什麼強烈建議不要通過'ref'傳遞結構?據我所知,這與在C++中通過引用傳遞(例如'std :: string&')是一樣的,並且它可以消除潛在的大型結構的不必要的複製。 –

+1

@cmbasnett:我強烈建議不要使用可變結構。通過ref傳遞一個結構是可以的,但是a)我會建議反對大型結構; b)我會反對*可變*結構(如微軟設計指南),因爲它們可能會導致一些意外。 –