É má prática para colocar um monte de código na função get de uma propriedade que envolve coisas PInvoke?

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

Pergunta

Um título que eu sei confuso. Deixe-me explicar.

Eu tenho que organizar um conjunto de estruturas, que, em seguida, são convertidos para uma série de aulas (compatibilidade legado). Por exemplo

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

}
Foi útil?

Solução

Visto sob um vácuo, não há nada de intrinsecamente errado com esta prática. No entanto, você deve ter cuidado em que ...

  1. getters de propriedade devem - com poucos (se houver) exceções - não ser "caro" (ou seja, não deve consumir muitos ciclos de CPU ou recursos para executar)
  2. getters propriedade nunca deve causar efeitos colaterais. Por exemplo, se o seu código PInvoke obtém um novo identificador de algum tipo, então ele deve ser uma função, não um getter.

Em geral, tenha em mente que as propriedades devem ser escritos de tal forma que o consumidor não deve ter muito, se for o caso, a razão para armazenar em cache o valor contra chamando a propriedade novamente. Se um desenvolvedor responsável poderia seguir essa prática com a sua propriedade, então você está no caminho certo.

Outras dicas

O getter de uma propriedade deve ser o mínimo possível. No seu caso, provavelmente é melhor usar um método regular. Especialmente porque retornando uma matriz de uma propriedade é também uma má idéia.

Não é pior para colocar esse código em um struct PInvoke que é para colocá-lo em uma estrutura normal. Para efeitos de PInvoke apenas os campos de um struct são considerados e, portanto, o seu código de propriedade não vai entrar em jogo. Ele só será relevante quando o código acede a essa propriedade particular.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top