2013-05-17 3 views
23

私のC#アプリケーションでは、コールバック/デリゲートのC++構造体へのポインタを受け取ります。私はclassがトリックを行うことができるかどうかは分かりませんが、適切なC#の構造体がうまく動作するので、データを格納するためにC#構造体を使用しています。C#structを参照渡ししますか?

は今、私はそれはおそらく完全にC++の構造体に「マップ」はありませんので、私はclassを使用することはできませんさらに処理するために

  • を構造体への参照を渡したいです。
  • 私はより良いレイテンシのために構造体をコピーしたくない

私はそれをどのように行うことができますか?


この例では、構造体が値ではなく、参照渡しされていることを示しています

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

C++のstruct: 'struct'については、classと全く同じです(デフォルトのアクセシビリティはありません)。C#では完全に異なる値と参照型です。おそらくC#でクラスを使う方が良いでしょう。少なくともC#で 'struct'がどのように動作するかを理解していなければなりません。 –

+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)私はmutable *構造体(Microsoftの設計ガイドラインのように)に対していくつかの驚きを引き起こす可能性があるので議論するだろう。 –