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

2

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

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

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

}
Теги:
properties
conventions
pinvoke

3 ответа

5
Лучший ответ

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

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

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

4

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

1

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

  • 0
    Я понимаю, что это будет работать, мне просто интересно, если идиоматически и мудро писать код, если это хорошо?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню