Ich erstelle eine Funktion, bei der ich ein Objekt übergeben muss, damit es von der Funktion geändert werden kann. Was ist der Unterschied zwischen:
public void myFunction(ref MyClass someClass)
und
public void myFunction(out MyClass someClass)
Welches soll ich verwenden und warum?
MyClass
wäre es einclass
Typ, dh ein Referenztyp. In diesem Fall kann das Objekt , das Sie passieren die modifiziert werden ,myFunction
sogar ohneref
/out
Schlüsselwort.myFunction
erhält eine neue Referenz, die auf dasselbe Objekt verweist , und kann dasselbe Objekt beliebig ändern. Der Unterschied dieref
Keyword machen würde, wäre, dassmyFunction
der empfangene gleichen Bezug auf das gleiche Objekt. Dies wäre nur dann wichtig, wennmyFunction
der Verweis so geändert würde, dass er auf ein anderes Objekt verweist .Antworten:
ref
teilt dem Compiler mit, dass das Objekt vor dem Aufrufen der Funktion initialisiert wird, währendout
dem Compiler mitgeteilt wird, dass das Objekt innerhalb der Funktion initialisiert wird.Also, während
ref
es in beide Richtungen geht,out
ist es nur out.quelle
Der
ref
Modifikator bedeutet:Der
out
Modifikator bedeutet:quelle
out
kann es überhaupt innerhalb der Methode gelesen werden, bevor es von dieser Methode festgelegt wurde, wenn es vor dem Aufruf der Methode initialisiert wurde? Ich meine, kann die aufgerufene Methode lesen, was die aufrufende Methode als Argument an sie übergeben hat?Nehmen wir an, Dom taucht in Peters Kabine über das Memo zu den TPS-Berichten auf.
Wenn Dom ein Ref-Argument wäre, hätte er eine gedruckte Kopie des Memos.
Wenn Dom ein Argument wäre, würde er Peter dazu bringen, eine neue Kopie des Memos auszudrucken, die er mitnehmen kann.
quelle
Ich werde mich an einer Erklärung versuchen:
Ich denke, wir verstehen, wie die Werttypen richtig funktionieren? Werttypen sind (int, long, struct usw.). Wenn Sie sie ohne einen ref-Befehl an eine Funktion senden, werden die Daten kopiert . Alles, was Sie mit diesen Daten in der Funktion tun, wirkt sich nur auf die Kopie aus, nicht auf das Original. Der Befehl ref sendet die IST-Daten und alle Änderungen wirken sich auf die Daten außerhalb der Funktion aus.
Ok, weiter zum verwirrenden Teil, Referenztypen:
Erstellen wir einen Referenztyp:
Wenn Sie ein Objekt neu erstellen , werden zwei Teile erstellt:
Wenn Sie nun ein Objekt in eine Methode ohne Referenz senden, kopiert es den Referenzzeiger , NICHT die Daten. Sie haben jetzt Folgendes:
Zwei Referenzen, die auf dasselbe Objekt verweisen. Wenn Sie eine Eigenschaft für ein Objekt mithilfe von Referenz2 ändern, wirkt sich dies auf dieselben Daten aus, auf die Referenz1 verweist.
Wenn Sie Referenz2 auf Null setzen oder auf neue Daten verweisen, wirkt sich dies weder auf Referenz1 noch auf die Datenreferenz1 aus.
Was passiert nun, wenn Sie ein Objekt per Referenz an eine Methode senden ? Der tatsächliche Verweis auf ein Objekt wird an die Methode gesendet. Sie haben jetzt nur noch einen Verweis auf die Daten:
Aber was bedeutet das? Es verhält sich genauso wie das Senden eines Objekts, nicht mit Ausnahme von zwei Hauptsachen:
1) Wenn Sie die Referenz innerhalb der Methode auf Null setzen, wird die außerhalb der Methode auf Null gesetzt.
2) Sie können jetzt die Referenz auf einen völlig anderen Datenort verweisen, und die Referenz außerhalb der Funktion zeigt jetzt auf den neuen Datenort.
quelle
ref
undout
Parametern nicht erklärt .out
Schlüsselwort erklären ?ref ist rein und raus .
Sie sollten
out
bevorzugt verwenden, wo immer es für Ihre Anforderungen ausreicht.quelle
aus:
In C # kann eine Methode nur einen Wert zurückgeben. Wenn Sie mehr als einen Wert zurückgeben möchten, können Sie das Schlüsselwort out verwenden. Der Modifikator out wird als Referenz zurückgegeben. Die einfachste Antwort ist, dass das Schlüsselwort "out" verwendet wird, um den Wert aus der Methode abzurufen.
ref:
Wenn Sie in C # einen Werttyp wie int, float, double usw. als Argument an den Methodenparameter übergeben, wird dieser als Wert übergeben. Wenn Sie den Parameterwert ändern, wirkt sich dies daher nicht auf das Argument im Methodenaufruf aus. Wenn Sie den Parameter jedoch mit dem Schlüsselwort "ref" markieren, wird er in der tatsächlichen Variablen wiedergegeben.
quelle
Beispiel Hund erweitern, Katze. Die zweite Methode mit ref ändert das Objekt, auf das der Aufrufer verweist. Daher "Katze" !!!
quelle
Da Sie einen Referenztyp (eine Klasse) übergeben, ist keine Verwendung erforderlich,
ref
da standardmäßig nur eine Referenz auf das tatsächliche Objekt übergeben wird und Sie daher immer das Objekt hinter der Referenz ändern.Beispiel:
Solange Sie eine Klasse bestehen, müssen Sie diese nicht verwenden,
ref
wenn Sie das Objekt in Ihrer Methode ändern möchten.quelle
someObject = null
toBar
end execute. Ihr Code wirdBar
einwandfrei ausgeführt, da nur der Verweis auf die Instanz auf Null gesetzt wurde. Wechseln Sie jetztBar
zuBar(ref MyClass someObject)
und führen Sie es erneut aus. Sie erhalten eine,NullReferenceException
weilFoo
der Verweis auf die Instanz ebenfalls auf Null gesetzt wurde.ref
undout
verhalten sich ähnlich, mit Ausnahme der folgenden Unterschiede.ref
Die Variable muss vor der Verwendung initialisiert werden.out
Variable kann ohne Zuordnung verwendet werdenout
Der Parameter muss von der Funktion, die ihn verwendet, als nicht zugewiesener Wert behandelt werden. Wir können also initialisierteout
Parameter im aufrufenden Code verwenden, aber der Wert geht verloren, wenn die Funktion ausgeführt wird.quelle
Für diejenigen, die anhand eines Beispiels lernen (wie ich), sagt Anthony Kolesov Folgendes .
Ich habe einige minimale Beispiele für ref, out und andere erstellt, um den Punkt zu veranschaulichen. Ich gehe nicht auf Best Practices ein, sondern nur auf Beispiele, um die Unterschiede zu verstehen.
https://gist.github.com/2upmedia/6d98a57b68d849ee7091
quelle
"Bäcker"
Das liegt daran, dass der erste Ihre Zeichenfolgenreferenz so ändert, dass er auf "Baker" zeigt. Das Ändern der Referenz ist möglich, weil Sie sie über das Schlüsselwort ref übergeben haben (=> eine Referenz auf eine Referenz auf eine Zeichenfolge). Der zweite Aufruf erhält eine Kopie des Verweises auf die Zeichenfolge.
Die Saite sieht auf den ersten Blick etwas Besonderes aus. Aber String ist nur eine Referenzklasse und wenn Sie definieren
dann ist s ein Verweis auf eine String-Klasse, die den Text "Able" enthält! Eine weitere Zuordnung zu derselben Variablen über
ändert nicht die ursprüngliche Zeichenfolge, sondern erstellt nur eine neue Instanz und zeigt auf diese Instanz!
Sie können es mit dem folgenden kleinen Codebeispiel versuchen:
Was erwartest du? Was Sie erhalten, ist immer noch "Able", da Sie nur die Referenz in s auf eine andere Instanz setzen, während s2 auf die ursprüngliche Instanz zeigt.
BEARBEITEN: Zeichenfolge ist auch unveränderlich, was bedeutet, dass es einfach keine Methode oder Eigenschaft gibt, die eine vorhandene Zeichenfolgeninstanz ändert (Sie können versuchen, eine in den Dokumenten zu finden, aber Sie werden keine finden :-)). Alle String-Manipulationsmethoden geben eine neue String-Instanz zurück! (Deshalb erzielen Sie häufig eine bessere Leistung, wenn Sie die StringBuilder-Klasse verwenden.)
quelle
ref bedeutet, dass der Wert im Parameter ref bereits festgelegt ist und von der Methode gelesen und geändert werden kann. Die Verwendung des Schlüsselworts ref entspricht der Aussage, dass der Aufrufer für die Initialisierung des Werts des Parameters verantwortlich ist.
out teilt dem Compiler mit, dass die Initialisierung des Objekts in der Verantwortung der Funktion liegt, die die Funktion dem Parameter out zuweisen muss. Es ist nicht erlaubt, es nicht zugewiesen zu lassen.
quelle
Out: Eine return-Anweisung kann verwendet werden, um nur einen Wert von einer Funktion zurückzugeben. Mithilfe von Ausgabeparametern können Sie jedoch zwei Werte von einer Funktion zurückgeben. Ausgabeparameter sind wie Referenzparameter, außer dass sie Daten eher aus der Methode als in diese übertragen.
Das folgende Beispiel veranschaulicht dies:
ref: Ein Referenzparameter ist eine Referenz auf einen Speicherort einer Variablen. Wenn Sie Parameter als Referenz übergeben, wird im Gegensatz zu Wertparametern kein neuer Speicherort für diese Parameter erstellt. Die Referenzparameter stellen denselben Speicherort dar wie die tatsächlichen Parameter, die der Methode zur Verfügung gestellt werden.
In C # deklarieren Sie die Referenzparameter mit dem Schlüsselwort ref. Das folgende Beispiel zeigt dies:
quelle
ref und out funktionieren genauso wie das Übergeben von Referenzen und das Übergeben von Zeigern wie in C ++.
Für ref muss das Argument deklariert und initialisiert werden.
Für out muss das Argument deklariert werden, kann aber initialisiert werden oder nicht
quelle
out double Half_nbr
.Authoring Time:
(1) Wir erstellen die aufrufende Methode
Main()
(2) Es erstellt ein Listenobjekt (das ein Referenztypobjekt ist) und speichert es in der Variablen
myList
.Während der Laufzeit:
(3) Runtime weist einen Speicher auf dem Stapel bei # 00 zu, der breit genug ist, um eine Adresse zu speichern (# 00 =
myList
, da Variablennamen eigentlich nur Aliase für Speicherorte sind).(4) Runtime erstellt ein Listenobjekt auf dem Heap am Speicherort #FF (alle diese Adressen sind zum Beispiel Sake).
(5) Runtime würde dann die Startadresse #FF des Objekts bei # 00 speichern (oder in Worten die Referenz des List-Objekts im Zeiger speichern
myList
).Zurück zur Authoring-Zeit:
(6) Wir übergeben dann das List-Objekt als Argument
myParamList
an die aufgerufene MethodemodifyMyList
und weisen ihr ein neues List-Objekt zuWährend der Laufzeit:
(7) Runtime startet die Aufrufroutine für die aufgerufene Methode und überprüft als Teil davon die Art der Parameter.
(8) Beim Auffinden des Referenztyps wird bei # 04 ein Speicher auf dem Stapel zum Aliasing der Parametervariablen zugewiesen
myParamList
.(9) Es speichert dann auch den Wert #FF darin.
(10) Runtime erstellt ein Listenobjekt auf dem Heap am Speicherort # 004 und ersetzt #FF in # 04 durch diesen Wert (oder dereferenziert das ursprüngliche List-Objekt und verweist bei dieser Methode auf das neue List-Objekt).
Die Adresse in # 00 wird nicht geändert und behält den Verweis auf #FF bei (oder der ursprüngliche
myList
Zeiger wird nicht gestört).Das Schlüsselwort ref ist eine Compiler-Direktive zum Überspringen der Generierung von Laufzeitcode für (8) und (9). Dies bedeutet, dass für Methodenparameter keine Heap-Zuordnung erfolgt. Es wird der ursprüngliche Zeiger # 00 verwendet, um das Objekt bei #FF zu bearbeiten. Wenn der ursprüngliche Zeiger nicht initialisiert wird, hört die Laufzeit auf, sich zu beschweren, dass er nicht fortgesetzt werden kann, da die Variable nicht initialisiert wird
Das Schlüsselwort out ist eine Compiler-Direktive, die mit einer geringfügigen Änderung bei (9) und (10) ziemlich genau der Referenz entspricht. Der Compiler erwartet, dass das Argument nicht initialisiert ist, und fährt mit (8), (4) und (5) fort, um ein Objekt auf dem Heap zu erstellen und seine Startadresse in der Argumentvariablen zu speichern. Es wird kein nicht initialisierter Fehler ausgegeben und alle zuvor gespeicherten Referenzen gehen verloren.
quelle
Neben Sie neu zuweisen jemand anderes Variable auf eine andere Instanz einer Klasse ermöglicht, mehrere Werte usw. zurückkehren, mit
ref
oderout
läßt wissen , jemand anderes , was man von ihnen braucht und was Sie mit den Variablen zu tun beabsichtigen , sie bietenSie brauchen
ref
oderout
müssen nur die Dinge in derMyClass
Instanz ändern , die im Argument übergeben wirdsomeClass
.someClass.Message = "Hello World"
ob Sie verwendenref
,out
oder nichtssomeClass = new MyClass()
InnerenmyFunction(someClass)
wird das Objekt ausgetauscht, das nursomeClass
im Bereich dermyFunction
Methode angezeigt wird. Die aufrufende Methode kennt immer noch die ursprünglicheMyClass
Instanz, die sie erstellt und an Ihre Methode übergeben hatSie benötigen
ref
oder möchten das Out gegen ein ganz neues Objektout
austauschensomeClass
und möchten, dass die aufrufende Methode Ihre Änderung siehtsomeClass = new MyClass()
InnerenmyFunction(out someClass)
ändert das Objekt, das von der aufgerufenen Methode gesehen wirdmyFunction
Andere Programmierer existieren
Und sie möchten wissen, was Sie mit ihren Daten tun werden. Stellen Sie sich vor, Sie schreiben eine Bibliothek, die von Millionen von Entwicklern verwendet wird. Sie möchten, dass sie wissen, was Sie mit ihren Variablen tun, wenn sie Ihre Methoden aufrufen
Mit using wird
ref
die Anweisung "Übergeben Sie eine Variable, die einem bestimmten Wert zugewiesen ist, wenn Sie meine Methode aufrufen. Beachten Sie, dass ich sie im Verlauf meiner Methode möglicherweise vollständig gegen etwas anderes austauschen kann. Erwarten Sie nicht, dass Ihre Variable auf das alte Objekt zeigt wenn ich fertig bin"Mit using wird
out
die Anweisung "Übergeben Sie eine Platzhaltervariable an meine Methode. Es spielt keine Rolle, ob sie einen Wert hat oder nicht; der Compiler zwingt mich, ihn einem neuen Wert zuzuweisen. Ich garantiere absolut, dass das Objekt, auf das Sie zeigen Variable, bevor Sie meine Methode aufgerufen haben, wird zu dem Zeitpunkt, an dem ich fertig bin , anders seinÜbrigens gibt es in C # 7.2 auch einen
in
ModifikatorDadurch wird verhindert, dass die Methode die übergebene Instanz gegen eine andere Instanz austauscht. Stellen Sie sich vor, Sie sagen zu diesen Millionen von Entwicklern: "Geben Sie mir Ihre ursprüngliche Variablenreferenz, und ich verspreche, Ihre sorgfältig ausgearbeiteten Daten nicht gegen etwas anderes auszutauschen."
in
hat einige Besonderheiten, und in einigen Fällen, z. B. wenn eine implizite Konvertierung erforderlich sein könnte, um Ihren Kurzfilm mit einem kompatibel zu machen, wirdin int
der Compiler vorübergehend einen Int erstellen, Ihren Kurzfilm darauf erweitern, ihn als Referenz übergeben und fertig stellen. Es kann dies tun, weil Sie erklärt haben, dass Sie sich nicht damit anlegen werden.Microsoft hat dies mit den
.TryParse
Methoden für die numerischen Typen getan :Indem Sie den Parameter markieren, während
out
er hier aktiv erklärt: "Wir werden Ihren sorgfältig ausgearbeiteten Wert von 98234957 definitiv gegen etwas anderes austauschen."Natürlich müssen sie das für Dinge wie das Parsen von Werttypen, denn wenn die Analysemethode den Wertetyp nicht gegen etwas anderes austauschen könnte, würde es nicht sehr gut funktionieren. Aber stellen Sie sich vor, es gäbe eine fiktive Methode in einigen Bibliothek, die Sie erstellen:
Sie können sehen, dass es eine ist
out
, und Sie können somit wissen, dass, wenn Sie Stunden damit verbringen, Zahlen zu knacken, die perfekte SomeClass erstellt wird:Nun, das war Zeitverschwendung, all diese Stunden zu brauchen, um diesen perfekten Unterricht zu machen. Es wird definitiv weggeworfen und durch PoorlyNamedMethod ersetzt
quelle
Für diejenigen, die eine prägnante Antwort suchen.
quelle
Um die vielen hervorragenden Erklärungen zu veranschaulichen, habe ich die folgende Konsolen-App entwickelt:
AppendWorld
: Eine Kopie vonStringList
namedLiStri
wird übergeben. Zu Beginn der Methode verweist diese Kopie auf die ursprüngliche Liste und kann daher zum Ändern dieser Liste verwendet werden.LiStri
Verweist später auf ein anderesList<string>
Objekt innerhalb der Methode, das die ursprüngliche Liste nicht beeinflusst.HalloWelt
:LiStriRef
ist ein Alias des bereits initialisiertenListStringRef
. Das übergebeneList<string>
Objekt wird verwendet, um ein neues zu initialisieren, daherref
war dies erforderlich.CiaoMondo
:LiStriOut
ist ein Alias vonListStringOut
und muss initialisiert werden.Wenn eine Methode nur das Objekt ändert, auf das von der übergebenen Variablen verwiesen wird, lässt der Compiler
out
Sie nicht zu und Sie sollten es nicht verwenden,ref
da dies nicht den Compiler, sondern den Leser des Codes verwirren würde. Wenn die Methode das übergebene Argument auf ein anderes Objekt verweisen lässt, verwenden Sie esref
für ein bereits initialisiertes Objekt undout
für Methoden, die ein neues Objekt für das übergebene Argument initialisieren müssen. Außerdemref
undout
benimm dich gleich.quelle
Sie sind ziemlich gleich - der einzige Unterschied besteht darin, dass eine Variable, die Sie als out-Parameter übergeben, nicht initialisiert werden muss und die Methode, die den ref-Parameter verwendet, sie auf etwas setzen muss.
Ref-Parameter beziehen sich auf Daten, die möglicherweise geändert werden. Out-Parameter beziehen sich auf Daten, die eine zusätzliche Ausgabe für die Funktion darstellen (z. B. int.TryParse), die bereits den Rückgabewert für etwas verwenden.
quelle
Unten habe ich ein Beispiel gezeigt, das sowohl Ref als auch out verwendet . Jetzt werden Sie alle über ref und out geklärt.
Im unten genannten Beispiel, wenn ich kommentiere // myRefObj = new myClass {Name = "ref außerhalb genannt !!"}; In der Zeile wird die Fehlermeldung "Verwendung der nicht zugewiesenen lokalen Variablen 'myRefObj'" angezeigt , es tritt jedoch kein solcher Fehler auf .
Verwendungszweck Ref : Wenn wir eine Prozedur mit einem in-Parameter aufrufen und derselbe Parameter zum Speichern der Ausgabe dieses Prozesses verwendet wird.
Verwendungszweck von Out: Wenn wir eine Prozedur ohne Parameter in aufrufen und derselbe Parameter verwendet wird, um den Wert von diesem Prozess zurückzugeben. Beachten Sie auch die Ausgabe
quelle
Sie können diesen Code überprüfen, der Ihnen den vollständigen Unterschied beschreibt, wenn Sie "ref" verwenden. Dies bedeutet, dass Sie diesen int / string bereits initialisiert haben
Aber wenn Sie "out" verwenden, funktioniert es unter beiden Bedingungen, ob Sie diesen int / string initialisieren oder nicht, aber Sie müssen diesen int / string in dieser Funktion initialisieren
quelle
Ref: Das Schlüsselwort ref wird verwendet, um ein Argument als Referenz zu übergeben. Dies bedeutet, dass der Wert dieses Parameters in der Methode in der aufrufenden Methode wiedergegeben wird. Ein Argument, das mit einem ref-Schlüsselwort übergeben wird, muss in der aufrufenden Methode initialisiert werden, bevor es an die aufgerufene Methode übergeben wird.
Out: Das Schlüsselwort out wird auch verwendet, um ein Argument wie das Schlüsselwort ref zu übergeben. Das Argument kann jedoch übergeben werden, ohne ihm einen Wert zuzuweisen. Ein Argument, das mit einem out-Schlüsselwort übergeben wird, muss in der aufgerufenen Methode initialisiert werden, bevor es zur aufrufenden Methode zurückkehrt.
Ref und out in Methodenüberladung
Sowohl ref als auch out können nicht gleichzeitig bei der Methodenüberladung verwendet werden. Ref und Out werden zur Laufzeit unterschiedlich behandelt, aber zur Kompilierungszeit werden sie gleich behandelt (CLR unterscheidet nicht zwischen beiden, während IL für ref und out erstellt wurde).
quelle
Vom Standpunkt einer Methode, die einen Parameter empfängt, besteht der Unterschied zwischen
ref
undout
darin, dass C # erfordert, dass Methodenout
vor der Rückgabe in jeden Parameter schreiben müssen und mit einem solchen Parameter nichts anderes tun dürfen, als ihn alsout
Parameter zu übergeben oder an ihn zu schreiben , bis es entweder alsout
Parameter an eine andere Methode übergeben oder direkt geschrieben wurde. Beachten Sie, dass einige andere Sprachen solche Anforderungen nicht stellen. Eine virtuelle oder Schnittstellenmethode, die in C # mit einemout
Parameter deklariert ist, kann in einer anderen Sprache überschrieben werden, die solchen Parametern keine besonderen Einschränkungen auferlegt.Vom Standpunkt des Aufrufers aus geht C # unter vielen Umständen davon aus, dass beim Aufrufen einer Methode mit einem
out
Parameter die übergebene Variable geschrieben wird, ohne zuvor gelesen worden zu sein. Diese Annahme ist möglicherweise nicht korrekt, wenn Methoden aufgerufen werden, die in anderen Sprachen geschrieben sind. Zum Beispiel:Wenn
myDictionary
eineIDictionary<TKey,TValue>
Implementierung identifiziert wird , die in einer anderen Sprache als C # geschrieben ist, obwohl sieMyStruct s = new MyStruct(myDictionary);
wie eine Zuweisung aussieht, kann sie möglicherweises
unverändert bleiben.Beachten Sie, dass in VB.NET geschriebene Konstruktoren im Gegensatz zu denen in C # keine Annahmen darüber treffen, ob aufgerufene Methoden
out
Parameter ändern und alle Felder bedingungslos löschen. Das oben erwähnte seltsame Verhalten tritt nicht bei Code auf, der vollständig in VB oder vollständig in C # geschrieben ist, sondern kann auftreten, wenn in C # geschriebener Code eine in VB.NET geschriebene Methode aufruft.quelle
Wenn Sie Ihren Parameter als Referenz übergeben möchten, sollten Sie ihn initialisieren, bevor Sie den Parameter an die Funktion übergeben. Andernfalls zeigt der Compiler selbst den Fehler an. Bei out-Parametern müssen Sie den Objektparameter jedoch nicht initialisieren, bevor Sie ihn an den übergeben Methode. Sie können das Objekt in der aufrufenden Methode selbst initialisieren.
quelle
Beachten Sie, dass der Referenzparameter, der innerhalb der Funktion übergeben wird, direkt bearbeitet wird.
Zum Beispiel,
Dies wird Hund schreiben, nicht Katze. Daher sollten Sie direkt an someObject arbeiten.
quelle
Ich bin vielleicht nicht so gut darin, aber Zeichenfolgen (obwohl sie technisch Referenztypen sind und auf dem Heap leben) werden als Wert übergeben, nicht als Referenz?
Aus diesem Grund benötigen Sie ref, wenn Änderungen außerhalb des Funktionsumfangs vorgenommen werden sollen. Andernfalls übergeben Sie keine Referenz.
Soweit mir bekannt ist, benötigen Sie nur ref für Strukturen / Werttypen und Zeichenfolge selbst, da Zeichenfolge ein Referenztyp ist, der vorgibt, dies zu sein, aber kein Werttyp ist.
Ich könnte hier allerdings völlig falsch liegen, ich bin neu.
quelle
Capitalize()
, die den Inhalt der Zeichenfolge in Großbuchstaben ändert. Wenn Sie dann Ihre Zeilea = "testing";
durch ersetzena.Capitalize();
würden, wäre Ihre Ausgabe "HALLO", nicht "Hallo". Einer der Vorteile unveränderlicher Typen besteht darin, dass Sie Referenzen weitergeben können und sich keine Sorgen machen müssen, dass anderer Code den Wert ändert.