Pinvoke 물건을 감싸는 속성의 기능에 많은 코드를 넣는 것이 나쁜 관행입니까?
-
11-07-2019 - |
문제
내가 아는 혼란스러운 제목. 설명하겠습니다.
나는 많은 스트러크 배열을 마샬링해야하며, 그로 인해 다양한 클래스 (레거시 호환성)로 변환됩니다. 예를 들어
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;
}
}
}
해결책
진공 상태에서 볼 때,이 연습에는 본질적으로 잘못된 것은 없습니다. 그러나 당신은 그것에주의해야합니다 ...
- 부동산 getters는 "비싸지 않은"예외를 제외하고는 (즉, 비싸지 않아야한다”(예 : 많은 CPU 사이클이나 리소스를 실행해서는 안됩니다)
- 속성 getters는 결코 부작용을 유발해서는 안됩니다. 예를 들어, Pinvoke 코드가 어떤 종류의 새 핸들을 얻는 경우 getter가 아닌 기능이어야합니다.
일반적으로 소비자가 값을 다시 캐시 해야하는 이유와 재산을 다시 호출 할 이유가없는 방식으로 속성을 작성해야합니다. 책임있는 개발자가 귀하의 재산으로 그 관행을 따를 수 있다면, 당신은 올바른 길을 가고 있습니다.
다른 팁
재산의 getter는 가능한 한 최소화되어야합니다. 귀하의 경우 일반 방법을 사용하는 것이 좋습니다. 특히 부동산에서 배열을 반환하는 것도 나쁜 생각이기 때문입니다.
해당 코드를 핀 보크 구조물에 넣는 것은 일반적인 구조물에 넣는 것보다 더 나쁘지 않습니다. Pinvoke의 목적을 위해 구조물의 필드 만 고려되므로 재산 코드가 작동하지 않습니다. 코드가 특정 속성에 액세스 할 때만 관련이 있습니다.
제휴하지 않습니다 StackOverflow