Это плохая практика - помещать много кода в функцию get свойства, которое оборачивает содержимое PInvoke? - PullRequest
2 голосов
/ 03 августа 2009

Запутанное название, которое я знаю. Позвольте мне объяснить.

Мне нужно упорядочить массив структур, которые затем преобразуются в массив классов (совместимость с прежними версиями). Например

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 ]

5 голосов
/ 03 августа 2009

Если смотреть в вакууме, в этой практике нет ничего плохого. Тем не менее, вы должны быть осторожны в этом ...

  1. Получатели свойств должны - за небольшим (если есть) исключением - не быть «дорогими» (т. Е. Не должны потреблять много циклов ЦП или ресурсов для выполнения)
  2. Собственники не должны НИКОГДА вызывать побочные эффекты. Например, если ваш код PInvoke получает новый дескриптор, он должен быть функцией, а не получателем.

В общем, имейте в виду, что свойства должны быть написаны таким образом, чтобы у потребителя не было особых причин для кеширования значения, а не повторного вызова свойства. Если ответственный разработчик может следовать этой практике с вашей собственностью, то вы на правильном пути.

4 голосов
/ 03 августа 2009

Получатель свойства должен быть как можно меньше. В вашем случае, вероятно, лучше использовать обычный метод. Тем более, что возвращать массив из свойства - тоже плохая идея.

1 голос
/ 03 августа 2009

Не хуже поместить этот код в структуру PInvoke, чем поместить его в обычную структуру. В целях PInvoke рассматриваются только поля структуры, и, следовательно, код вашего свойства не будет задействован. Это будет актуально только тогда, когда ваш код обращается к этому конкретному свойству.

...