我知道一个令人困惑的标题。让我解释一下。
我必须编码一个结构数组,然后将其转换为一个类数组(遗留兼容性)。例如
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;
}
}
}
最佳答案
从真空中看,这种做法本质上没有错。但是,你应该小心......
- 属性 getter 应该——除了少数(如果有的话)异常(exception)——不是“昂贵的”(即,不应该消耗很多 CPU 周期或资源来执行)
- Property getters 应该永远不会产生副作用。例如,如果您的 PInvoke 代码获得某种新句柄,那么它应该是一个函数,而不是 getter。
一般而言,请记住属性的编写方式应使消费者没有太多(如果有的话)缓存值而不是再次调用属性的理由。如果负责任的开发商可以在您的属性(property)上遵循这种做法,那么您就走在了正确的轨道上。
关于c# - 在包装 PInvoke 东西的属性的 get 函数中放置大量代码是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223991/