Est-ce une mauvaise pratique de mettre beaucoup de code dans la fonction get d'une propriété qui enveloppe le contenu de PInvoke?

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

Question

Un titre déroutant que je connaisse. Laissez-moi vous expliquer.

Je dois rassembler un tableau de structures, qui sont ensuite converties en un tableau de classes (compatibilité héritée). Par exemple

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

}
Était-ce utile?

La solution

Vu dans le vide, il n’ya rien de mal à cette pratique. Cependant, vous devriez faire attention à cela ...

  1. Les getters de propriétés devraient, à quelques exceptions près (le cas échéant), ne pas être "coûteux". (c’est-à-dire qu’ils ne devraient pas consommer beaucoup de cycles de traitement ou de ressources à exécuter)
  2. Les getters de propriétés ne doivent JAMAIS causer d’effets secondaires. Par exemple, si votre code PInvoke obtient un nouveau descripteur, il doit s'agir d'une fonction et non d'un getter.

En général, gardez à l'esprit que les propriétés doivent être écrites de telle sorte que le consommateur ne doit pas avoir beaucoup de raisons, le cas échéant, de la mettre en cache, plutôt que de la rappeler. Si un développeur responsable peut suivre cette pratique avec votre propriété, vous êtes sur la bonne voie.

Autres conseils

Le getter d'une propriété doit être aussi minime que possible. Dans votre cas, il vaut probablement mieux utiliser une méthode régulière. Surtout parce que le retour d'un tableau à partir d'une propriété est également une mauvaise idée.

Ce n'est pas pire de mettre ce code dans une structure PInvoke que de le mettre dans une structure normale. Aux fins de PInvoke, seuls les champs d'une structure sont pris en compte et, par conséquent, votre code de propriété n'entre pas en jeu. Cela ne sera pertinent que lorsque votre code aura accès à cette propriété particulière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top