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. 属性获取器应该——很少(如果有的话)异常——不是“昂贵的”(即,不应该消耗很多 CPU 周期或资源来执行)
  2. 属性 getter 永远不应该引起副作用。例如,如果您的 PInvoke 代码获得了某种新的句柄,那么它应该是一个函数,而不是一个 getter。

一般来说,请记住,属性应该以这样一种方式编写,即消费者不应该有太多(如果有的话)缓存值而不是再次调用属性的理由。如果负责任的开发商可以在您的财产上遵循这种做法,那么您就走在了正确的轨道上。

于 2009-08-03T18:57:46.693 回答
4

属性的 getter 应尽可能少。在您的情况下,使用常规方法可能会更好。特别是因为从属性返回数组也是一个坏主意。

于 2009-08-03T18:56:32.687 回答
1

将该代码放入 PInvoke 结构中并不比将其放入普通结构中更糟糕。出于 PInvoke 的目的,仅考虑结构的字段,因此您的属性代码不会发挥作用。只有当您的代码访问该特定属性时,它才会相关。

于 2009-08-03T18:55:29.227 回答