将大量代码放在包含PInvoke内容的属性的get函数中是不好的做法?

时间:2009-08-03 18:51:40

标签: c# .net properties pinvoke conventions

我知道一个令人困惑的标题。让我解释一下。

我必须编组一个结构数组,然后将其转换为类数组(传统兼容性)。例如

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;
      }
   }

}

3 个答案:

答案 0 :(得分:5)

在真空中观察,这种做法没有任何本质上的错误。但是,你应该小心......

  1. 属性获取者应该 - 很少(如果有的话)例外 - 不是“昂贵”(即,不应该消耗许多CPU周期或资源来执行)
  2. 物业吸气者不应该造成副作用。例如,如果您的PInvoke代码获得某种新的句柄,那么它应该是一个函数,而不是一个getter。
  3. 一般来说,请记住,属性应该以这样的方式编写,即消费者不应该有很多(如果有的话)缓存值而不是再次调用属性的理由。如果负责任的开发人员可以对您的财产采取这种做法,那么您就是在正确的轨道上。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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