C # Überladen des Zeichenoperators

7

G'Day Mates -

Was ist der richtige Weg (ohne das Argument, ob es ratsam ist), die String-Operatoren & lt ;, & gt ;, & lt; = und & gt; =?

zu überladen

Ich habe es fünfmal bis Sonntag probiert und ich bekomme verschiedene Fehler - mein bestes war, eine partielle Klasse zu deklarieren und von dort zu überladen, aber es wird aus irgendeinem Grund nicht funktionieren.

%Vor%

}

    
Scott Baker 06.04.2010, 19:20
quelle

6 Antworten

16

String ist eine versiegelte Klasse. Sie können nicht davon erben, und ohne die ursprüngliche Quelle für String können Sie keine partielle Klasse davon kompilieren. Selbst wenn Sie die Quelle (über Reflector oder über den Visual Studio-Symbol-Download) erhalten, haben Sie immer noch Probleme, da es sich um einen erstklassigen Bürger in der Laufzeit handelt.

Brauchst du wirklich & lt; und & gt; als Operatoren an der Schnur? Wenn ja ... warum nicht einfach Erweiterungsmethoden ?

%Vor%     
Randolpho 06.04.2010, 19:23
quelle
15

Es gibt keine Möglichkeit, irgendein integriertes Verhalten des Compilers durch Ihren eigenen zu ersetzen. Sie können vorhandene integrierte Operatoren für Vergleiche, Konvertierungen, Arithmetik usw. nicht überschreiben. Das ist von Entwurf; Es ist so, dass jemand Ihren Code lesen kann und wissen, dass int x = M(); int y = x + 2; ganzzahlige Arithmetik verwendet, im Gegensatz zu, sagen wir, formatieren Sie Ihre Festplatte.

Können Sie erklären, warum Sie das tun wollen? Vielleicht gibt es einen besseren Weg, um zu tun, was Sie wollen.

    
Eric Lippert 06.04.2010 20:07
quelle
10

Die einfache Antwort ist, dass Sie nicht können; Es gibt keine Möglichkeit, die Operatoren für eine andere Klasse zu ändern. Teilklassen sind nur für Klassen zulässig, deren <%> partial in allen Dateien deklariert und in derselben Baugruppe definiert ist.

    
Adam Robinson 06.04.2010 19:23
quelle
5

Meinst du die Klasse System.String ? Das ist unmöglich in C #. Sie können Erweiterungsoperatoren nicht zu einer vorhandenen Klasse hinzufügen. Es ist jedoch eine viel angeforderte Funktion.

    
Daniel Earwicker 06.04.2010 19:23
quelle
3
  • Sie können keine partielle Klasse für string haben, weil die string-Klasse selbst nicht partiell ist und daher nicht mit Ihrer partiellen Klasse arbeitet.

  • Die Zeichenfolge ist versiegelt, sodass Sie sie erben und den Operator dann überlasten können.

Kurz gesagt, Sie können nicht tun, was Sie tun müssen.

Ich weiß nicht, was Sie genau machen wollen, ich kann Ihnen keine gute Alternative vorschlagen. Aber werfen Sie einen Blick auf Erweiterungsmethoden , die oft gut sind für Situationen. Abgesehen davon, ob Sie sollten :), könnten Sie der String-Klasse eine Methode namens IsGreaterThan hinzufügen und true oder false zurückgeben, wie Sie es wünschen. Das ist gut, weil Sie der Erweiterungsmethode einen Namen geben können, der ihre Bedeutung klar macht, die vorhandenen Operatoren im Takt hält (worüber Sie sowieso keine Wahl haben) und schnellen / einfachen Code erlaubt.

    
Patrick Karcher 06.04.2010 19:24
quelle
1

Sie können den Operator & gt; = und & lt; = nicht direkt überladen, aber Sie können das gleiche Ergebnis erzielen, wenn Sie den Befehl & gt; und das == getrennt.

Ihr Code scheint mir korrekt zu sein, außer dass Sie das Überladen für == vermissen.

Scheint, ich habe mich geirrt, aber Sie können immer wieder auf Reflexion zurückgreifen. Ich denke, wenn Sie etwas graben und hacken, können Sie es mit Reflektion arbeiten lassen, um die Klasse zu erweitern, da Reflektion erlaubt, Funktionen hinzuzufügen oder Funktionskörper zur Laufzeit zu tauschen.

Ob es ratsam und gut ist, bezweifle ich. Es gibt einen Grund, warum die Klasse versiegelt ist. Das, was ich erwähnte, kann unter bestimmten Umständen zu undefiniertem Verhalten aufgrund einiger Annahmen führen, die das .net-Framework für Zeichenfolgen vornimmt. Die Wahrscheinlichkeit ist groß, dass die String-Klasse intern zusammenfällt.

    
Henri 06.04.2010 19:25
quelle

Tags und Links