2

私が知っている紛らわしいタイトル。説明させてください。

構造体の配列をマーシャリングする必要があります。その後、構造体はクラスの配列に変換されます(レガシー互換性)。例えば

public class InnerClass {}

public class OuterClass { private InnerClass[] innerClasses; }


public struct InnerStruct {
   // Data
}

private static buildInnerClass( InnerStruct i );

public struct OuterStruct {
   private int _numInnerStructs;
   private IntPtr _innerStructs;
   // Other members

   public InnerClass[] InnerClasses {
      get {
             InnerClass[] ret = new InnerClass[_numInnerStructs];

             var structSize = Marshal.SizeOf(typeof(InnerStruct));
             var ptr = _innerStructs;

             for (int i = 0; i < _numInnerStructs; i++)
             {
                InnerStruct innerStruct = (InnerStruct)Marshal.PtrToStructure(
                                          ptr, typeof(InnerStruct));
                ret[i] = buildInnerClass(innerStruct);
                ptr = (IntPtr)((int)ptr + structSize);
             }
             return ret;
      }
   }

}
4

3 に答える 3

5

孤立して見ると、この慣習に本質的な問題はありません。ただし、その場合は注意が必要です...

  1. プロパティの getter は、(もしあれば) 例外はほとんどありませんが、「高価」であってはなりません (つまり、実行に多くの CPU サイクルやリソースを消費してはなりません)。
  2. プロパティのゲッターは、決して副作用を引き起こすべきではありません。たとえば、PInvoke コードが何らかの新しいハンドルを取得する場合、それは getter ではなく関数である必要があります。

一般に、プロパティは、コンシューマがプロパティを再度呼び出すよりも値をキャッシュする理由が (あるとしても) ないように記述する必要があることに注意してください。責任ある開発者があなたのプロパティでその慣行に従うことができれば、あなたは正しい方向に進んでいます.

于 2009-08-03T18:57:46.693 に答える
4

プロパティのゲッターは、可能な限り最小限にする必要があります。あなたの場合、通常の方法を使用する方がおそらく良いでしょう。特に、プロパティから配列を返すことも悪い考えであるためです。

于 2009-08-03T18:56:32.687 に答える
1

そのコードをPInvoke構造体に配置することは、通常の構造体に配置することよりも悪いことではありません。PInvokeの目的では、構造体のフィールドのみが考慮されるため、プロパティコードは機能しません。コードがその特定のプロパティにアクセスする場合にのみ関連します。

于 2009-08-03T18:55:29.227 に答える