Existe-t-il un impact négatif sur la création de méthodes d’extension fonctionnant à partir du type “object”?

J’ai un ensemble de méthodes d’extension que j’utilise régulièrement pour diverses tâches d’interface utilisateur. En général, je les définis pour qu’ils s’exécutent à partir d’un object type, même si, à l’intérieur, je les convertis généralement en types de chaîne.

 public static ssortingng FormatSomething(this object o) { if( o != null ) { ssortingng s = o.ToSsortingng(); /// do the work and return something. } // return something else or empty ssortingng. } 

La raison principale pour laquelle j’utilise le type object et non ssortingng est pour éviter de devoir faire quand je peux faire place.

Alors, est-il acceptable du sharepoint vue des performances de créer toutes les méthodes d’extension sur un object ou dois-je les convertir en types ssortingng (ou pertinents) en fonction de ce que la méthode d’extension fait?

Existe-t-il un problème de performances pour la création de méthodes d’extension basées sur le type d’object?

Oui. Si vous passez un type de valeur, le type de valeur sera encadré. Cela crée une pénalité de performance consistant à atsortingbuer la boîte et à faire la copie, sans oublier bien sûr de devoir récupérer la boîte ultérieurement.

Au lieu de

 public static ssortingng FormatSomething(this object o) { return (o != null) ? o.ToSsortingng() : ""; } 

Je souhaiterai écrire

 public static ssortingng FormatSomething(this T o) { return (o != null) ? o.ToSsortingng() : ""; } 

Cela a le même effet, mais évite la pénalité de boxe. Ou plutôt, il échange une pénalité de boxe par appel contre une pénalité de coût du premier appel .

Est-il acceptable du sharepoint vue des performances de créer toutes les méthodes d’extension sur un object?

Nous ne pouvons pas répondre à la question. Essayez le! Mesurez la performance, comparez-la à la performance souhaitée et voyez si vous avez atteint votre objective. Si vous avez fait, super. Sinon, utilisez un profileur, recherchez la solution la plus lente et corrigez-la.

Mais ni l’une ni l’autre question n’est la question que vous devriez poser. La question que vous auriez dû poser est la suivante:

Est-ce une bonne pratique de programmation de créer une méthode d’extension qui étend tout?

Non, ce n’est presque jamais une bonne idée. Dans la plupart des cas où les gens veulent faire cela, ils abusent du mécanisme de la méthode d’extension. Il existe généralement un type plus spécifique qui pourrait être étendu. Si vous faites cela souvent, vous vous retrouverez avec de nombreuses méthodes d’extension pour chaque type, et le codage devient confus et source d’erreurs.

Par exemple, supposons que vous souhaitiez une méthode d’extension qui réponde à la question “cette séquence contient-elle cette valeur?” Vous pouvez écrire:

 public static bool IsContainedIn(this T item, IEnumerable sequence) 

et ensuite dire

 if (myInt.IsContainedIn(myIntSequence)) 

Mais il vaut beaucoup mieux dire:

 public static bool Contains(this IEnumerable sequence, T item) 

et ensuite dire

 if (myIntSequence.Contains(myInt)) 

Si vous le faites de la première manière, vous tapez dans l’EDI et chaque fois que vous tapez “.”, Vous êtes invité avec l’option IsContainedIn car vous êtes peut -être sur le point d’écrire du code qui détermine si cet object est dans une collection. Mais 99% du temps, vous n’allez pas faire ça. Cela ajoute du bruit à l’outillage et rend plus difficile la recherche de ce que vous voulez vraiment.

Je doute sérieusement qu’il y aurait des implications sur les performances en dehors de l’impact IDE. Une fois compilé, je ne pense pas que cela ferait une différence.

Comparé au moment où vous appelez ToSsortingng, l’appel à FormatSomething n’est pas vraiment (votre contrôle nul risque de prendre quelques ms de plus, mais rend également le code plus robuste.

Même si le type de compilation de l’object sur lequel vous appelez la méthode était une chaîne, cela ferait une différence visible.

Ne vous préoccupez pas des performances jusqu’à ce que vous renconsortingez un problème de performances. Jusque-là, préoccupez-vous de la maintenabilité, y compris la lisibilité. Si vous rencontrez un problème de performances, utilisez un profileur pour savoir où il se trouve.

Quelle surcharge est associée à une méthode d’extension au moment de l’exécution? (.NET) répond à votre question je pense. Les méthodes d’extension sont juste des méthodes statiques, elles n’appartiennent donc pas au type Object. Intellisense ne fait que sembler ainsi.