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

Dev*_*Dev 2 .net c# pinvoke properties 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;
      }
   }

}
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 5

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

  1. 属性getter应该 - 很少(如果有的话)例外 - 不是"昂贵的"(即,不应该消耗许多CPU周期或资源来执行)
  2. 财产瘾者不应该造成副作用.例如,如果你的PInvoke代码获得某种新的句柄,那么它应该是一个函数,而不是一个getter.

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