Pinvoke 물건을 감싸는 속성의 기능에 많은 코드를 넣는 것이 나쁜 관행입니까?

StackOverflow https://stackoverflow.com/questions/1223991

문제

내가 아는 혼란스러운 제목. 설명하겠습니다.

나는 많은 스트러크 배열을 마샬링해야하며, 그로 인해 다양한 클래스 (레거시 호환성)로 변환됩니다. 예를 들어

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

}
도움이 되었습니까?

해결책

진공 상태에서 볼 때,이 연습에는 본질적으로 잘못된 것은 없습니다. 그러나 당신은 그것에주의해야합니다 ...

  1. 부동산 getters는 "비싸지 않은"예외를 제외하고는 (즉, 비싸지 않아야한다”(예 : 많은 CPU 사이클이나 리소스를 실행해서는 안됩니다)
  2. 속성 getters는 결코 부작용을 유발해서는 안됩니다. 예를 들어, Pinvoke 코드가 어떤 종류의 새 핸들을 얻는 경우 getter가 아닌 기능이어야합니다.

일반적으로 소비자가 값을 다시 캐시 해야하는 이유와 재산을 다시 호출 할 이유가없는 방식으로 속성을 작성해야합니다. 책임있는 개발자가 귀하의 재산으로 그 관행을 따를 수 있다면, 당신은 올바른 길을 가고 있습니다.

다른 팁

재산의 getter는 가능한 한 최소화되어야합니다. 귀하의 경우 일반 방법을 사용하는 것이 좋습니다. 특히 부동산에서 배열을 반환하는 것도 나쁜 생각이기 때문입니다.

해당 코드를 핀 보크 구조물에 넣는 것은 일반적인 구조물에 넣는 것보다 더 나쁘지 않습니다. Pinvoke의 목적을 위해 구조물의 필드 만 고려되므로 재산 코드가 작동하지 않습니다. 코드가 특정 속성에 액세스 할 때만 관련이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top