42 votes

Question de performance en C# : typeof(MyClass) vs. this.GetType()

Dans le premier exemple de l Manuel de configuration de log4net l'auteur utilise typeof(MyApp) pour obtenir le type de la classe contenue MyApp . Y a-t-il une raison de ne pas utiliser this.GetType() en termes de performances ? Parce qu'il me semble que this.GetType() est beaucoup plus sûre contre les erreurs potentielles de copier-coller lorsqu'elle est copiée dans une autre classe.

7 votes

Lorsque vous n'avez pas d'instance, seul TYPEOF est disponible, n'est-ce pas ?

95voto

MikeP Points 4823

typeof(Foo) est une recherche de type statique ; elle se produit essentiellement au moment de la compilation, de sorte que vous n'obtenez que le type explicitement nommé.

GetType() est une recherche dynamique de type ; c'est une méthode virtuelle qui est appelée au moment de l'exécution et qui vous donnera le type exact même si vous utilisez le polymorphisme. C'est donc "plus lent", théoriquement, mais cela vous donne quelque chose que vous ne pouvez pas obtenir à partir de typeof(T) . Si vous avez besoin de l'un ou l'autre pour votre conception, la vitesse ne sera pas un facteur déterminant.

16voto

Ani Points 59747

Les problèmes de performance mis à part, dans l'exemple fourni, GetType n'est même pas une option car il s'agit d'une instance Elle ne peut pas être appelée à partir d'un initialisateur de champ. Dans tous les cas, puisque l'intention est d'initialiser un fichier statique à partir d'un "contexte" statique, logiquement une this ne peut pas être disponible - donc suivre la voie du constructeur statique n'aiderait pas à permettre à l'utilisateur d'avoir accès à l'information. GetType soit.

// Can't use GetType() - the this reference is not available.
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

0 votes

Tu as raison, comme je suis stupide de ne pas avoir remarqué le static mot-clé :)

4 votes

@Ani, mais qu'en est-il des performances, lorsque l'objet et le nom du type sont tous deux connus ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X