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

.
War es hilfreich?

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, ...) sowie structs werden passieren "Kopie" (wie Sie es nennen), während in

  • Referenztypen , die classes 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top