J'essaie d'utiliser des méthodes d'extension pour ajouter une surcharge d'opérateur à la StringBuilder
classe C # . Plus précisément, étant donné StringBuilder
sb
, j'aimerais sb += "text"
devenir équivalent à sb.Append("text")
.
Voici la syntaxe pour créer une méthode d'extension pour StringBuilder
:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Il ajoute avec succès la blah
méthode d'extension au fichier StringBuilder
.
Malheureusement, la surcharge des opérateurs ne semble pas fonctionner:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Entre autres problèmes, le mot this
- clé n'est pas autorisé dans ce contexte.
L'ajout de surcharges d'opérateurs via des méthodes d'extension est-il possible? Si oui, quelle est la bonne façon de procéder?
c#
extension-methods
operator-overloading
Jude Allred
la source
la source
Réponses:
Ce n'est actuellement pas possible, car les méthodes d'extension doivent être dans des classes statiques et les classes statiques ne peuvent pas avoir de surcharges d'opérateurs.
Mads Torgersen, PM du langage C # dit:
Éditer:
Je viens de remarquer, Mads a écrit plus dans le même article :
Cette fonctionnalité est actuellement sur la table (potentiellement) pour C # 8.0. Mads parle un peu plus de sa mise en œuvre ici .
la source
String
en PowerShellScriptBlock
.true.Xor(false)
moment^
est l'opérateur xor en C #Si vous contrôlez les endroits où vous souhaitez utiliser cet "opérateur d'extension" (ce que vous faites normalement avec les méthodes d'extension de toute façon), vous pouvez faire quelque chose comme ceci:
La
StringBuilderWrapper
classe déclare un opérateur de conversion implicite à partir de aStringBuilder
et déclare l'+
opérateur souhaité . De cette façon, aStringBuilder
peut être passé àReceiveImportantMessage
, qui sera silencieusement converti en aStringBuilderWrapper
, où le+
opérateur peut être utilisé.Pour rendre ce fait plus transparent pour les appelants, vous pouvez déclarer
ReceiveImportantMessage
comme prenant unStringBuilder
et utiliser simplement un code comme celui-ci:Ou, pour l'utiliser en ligne là où vous utilisez déjà a
StringBuilder
, vous pouvez simplement faire ceci:J'ai créé un article sur l'utilisation d'une approche similaire pour rendre
IComparable
plus compréhensible.la source
StringBuilderWrapper
qui le rend possible.StringBuilder
type et fournira un opérateur de conversion implicite à partir de celui-ci. Après cela, il peut être utilisé avec des chaînes littérales, comme illustré dans l'exemple:sb += "Hello World!";
String
:PushIndent(" ".X(4))
(pourrait également être appeléeTimes
). Ou peut - être en utilisant ce constructeur:PushIndent(new String(' ', 4))
.Il semble que ce ne soit pas possible actuellement - il y a un problème de rétroaction ouvert demandant cette fonctionnalité même sur Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
suggérant qu'il pourrait apparaître dans une version future mais n'est pas implémenté pour la version actuelle.
la source
Bien qu'il ne soit pas possible de faire les opérateurs, vous pouvez toujours simplement créer des méthodes Add (ou Concat), Subtract et Compare ....
la source
Hah! Je recherchais "surcharge d'opérateur d'extension" avec exactement le même désir, pour sb + = (chose).
Après avoir lu les réponses ici (et vu que la réponse est «non»), pour mes besoins particuliers, je suis allé avec une méthode d'extension qui combine sb.AppendLine et sb.AppendFormat, et semble plus ordonnée que l'un ou l'autre.
Et donc,
Ce n'est pas une réponse générale, mais peut intéresser les futurs chercheurs qui s'intéressent à ce genre de choses.
la source
AppendLine
au lieu deLine
.Il est possible de le configurer avec un wrapper et des extensions mais impossible de le faire correctement. Vous terminez avec des ordures qui vont totalement à l'encontre de l'objectif. J'ai un message quelque part ici qui le fait, mais cela ne vaut rien.
Btw Toutes les conversions numériques créent des déchets dans le générateur de chaînes qui doivent être corrigés. J'ai dû écrire un wrapper pour ce qui fonctionne et je l'utilise. Cela vaut la peine d'être lu.
la source