Übergeben Sie kopieren oder Referenz?
-
30-09-2019 - |
Frage
Ich bin ein bisschen neu in C # und habe mich nur gefragt, ob es eine Liste der Klassen ist (häufig verwendet), die als Kopie übergeben standardmäßig sind. Wie kann ich sie erkennen?
Ich weiß, dass die grundlegenden Basisobjekttypen - int, uint, Schwimmer, Strings, ... - durch Kopie übergeben
.Lösung
In C # / .Net-Objekte können entweder als Wert oder Referenztypen klassifiziert werden [1]. Werttypen sind jede Art, die aus System.ValueType
ableiten und in C # definiert mit der struct
Typdeklaration. Diese wird durch Kopieren / Wert übergeben.
Referenztypen sind Typen, die stammen nicht aus System.ValueType
und sind in C # mit dem class
Schlüsselwort definiert. Identifiers auf Instanzen von Referenztypen werden als Referenzen (ähnlich Zeiger) bekannt. Diese werden auch von Wert standardmäßig übergeben, sondern nur der Verweis übergeben wird nicht das ganze Objekt.
Ihre Frage auch erwähnt, dass string
Instanzen durch Kopie übergeben werden. String
in Net ist ein Referenztyp (ergibt sich unmittelbar aus System.Object
) und damit nicht durch vollständige Kopie weitergegeben.
[1] Pointers können ihre eigene Klasse hier verdienen, aber ich ignoriere sich für diese Diskussion.
Andere Tipps
Alle Typen sind standardmäßig als Wert übergeben. Der Unterschied zwischen Werttypen (struct
) und Referenztypen (class
) ist, dass ein für Werttypen Kopieren des Wertes an die Methode übergeben wird , während für Referenztypen nur eine Referenz übergeben wird.
Siehe MSDN für weitere Details.
Auch nicht verwechseln den Begriff der Wert / Referenztypen und den Begriff Parameter Wert vorbei oder durch Bezugnahme eingeschlossen. Siehe dieser Artikel von Jon Skeet für Details
In der Regel
-
Werttypen , die einheimische Arten umfasst (
int
,float
, ...) sowiestruct
s werden passieren "Kopie" (wie Sie es nennen), während in -
Referenztypen , die
class
es enthält, nur eine Referenz anstelle des vollständigen Objekts kopiert wird.
Beachten Sie jedoch, dass string nicht "kopieren" bestanden! Es ist ein Referenz-Typ, aber da es unveränderlich ist, es auf einen Wert Typ ähnlich verhält.
Beachten Sie, dass das ref
Schlüsselwort in beiden Fällen nützlich sein kann: Im Fall von Werttypen, bedeutet dies, dass der Wert wieder kopiert wird. Im Fall von Referenztypen, bedeutet dies, dass die Hinweis kann (das heißt, dass Sie die Variable auf ein neues Objekt zuweisen können, anstatt nur die Eigenschaften des Objekts zu ändern.) Geändert wird
Beachten Sie auch, dass struct Objekte Referenztypen können sein:
struct Currency
{
int Amount {get;set;} // is referenced by value (copy)
string Code {get;set;} // is referenced by reference
}
Wenn Sie Ihre Anwendung, dass Struktur wie folgt aus:
var obj1 = new Currency{Amount = 1, Code = "USD"};
var obj2 = obj1;
Dann
object.ReferenceEquals(obj1.Code, obj2.Code); // false - string is reference type, but used inside value type
Wenn Sie Währung als Klasse deklariert dann Verweise auf Kodex waren die gleichen.