Ich weiß, dass ein int ein Werttyp ist, aber was sind Arrays von Werttypen? Referenztypen? Werttypen? Ich möchte ein Array an eine Funktion übergeben, um etwas zu überprüfen. Sollte ich nur das Array übergeben, da es nur die Referenz davon übergeben wird, oder sollte ich es als ref übergeben?
124
Antworten:
https://msdn.microsoft.com/en-us/library/bb985948.aspx
quelle
Der einfachste Test für Referenztyp vs. Werttyp ist, dass Referenztypen sein können
null
, Werttypen jedoch nicht.quelle
Arrays (auch von Werttypen wie int) sind Referenztypen in C #.
http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx :
quelle
Zuerst möchte ich Ihnen sagen, dass Array ein Referenztyp ist. Warum? Ich erkläre hier ein Beispiel.
Beispiel:
Auch Referenztypen können null sein, Werttypen dagegen nicht.
Wertetyp im Stapel und Referenztyp im Heap
Sie können das Array mit out oder ref an die Funktion übergeben. Nur Initialisierungsmethoden sind unterschiedlich.
Mehr..
quelle
Testen Sie, ob es sich um einen Referenz- oder Wertetyp handelt:
Sie können es online testen: https://dotnetfiddle.net/UWFP45
quelle
Das Array selbst ist ein Referenztyp. Die Werte dieses Arrays sind Wert- oder Referenztypen, die vom Array-Datentyp bestimmt werden. In Ihrem Beispiel ist das Array ein Referenztyp und die Werte sind Werttypen.
Alle eindimensionalen Arrays implementieren implizit
IList<T>
, wobei<T>
der Datentyp des Arrays ist. Sie können diese Schnittstelle stattdessen als Datentyp Ihres Methodenparameters verwenden. Sie können auchIEnumerable<T>
für den Datentyp verwenden. In beiden Fällen (oder auch wenn Sie nur verwendenint[]
) sollten Sie es nicht explizit alsref
Parameter übergeben müssen.quelle
// Der Verweis auf das Array wird als Wert übergeben. Dies ist die Quelle der Verwirrung :-) ...
quelle
Arrays sind immer Referenztypen. Es spielt keine Rolle, dass das Array einen Werttyp wie int oder einen Referenztyp wie string enthält. Wenn Sie beispielsweise ein Array deklarieren
int[] integers=new int[10]
;;Die Ganzzahlvariable selbst enthält nur einen Verweis auf das Array, das sich im Heap befindet.
Es wird auch von vielen Leuten erwähnt, dass Sie den Werttyp vom Referenztyp unterscheiden können. Dies hängt nur davon ab, ob die Variable null sein kann oder nicht. Ich möchte erwähnen, dass in c # derzeit Werttypen auch null sein können
zum Beispiel
und es ist keine gute Möglichkeit, den Typ als Referenz zu identifizieren, oder der Wert hängt nur davon ab, ob die Variable null sein kann oder nicht.
quelle
Nur ein kleiner Einblick:
Stellt beispielsweise
int
eine einzelne Ganzzahl dar,int[]
repräsentiert ein Array von Ganzzahlen.Um das Array mit bestimmten Abmessungen zu initialisieren, können Sie das
new
Schlüsselwort verwenden und die Größe in eckigen Klammern nach dem Typnamen angeben:Alle Arrays sind Referenztypen und folgen der Referenzsemantik. Daher ist das
integers
Array in diesem Code ein Referenztyp , obwohl die einzelnen Elemente primitive Werttypen sind. Also, wenn Sie später schreiben:Dadurch wird einfach die gesamte Variablenkopie so zugewiesen, dass sie auf dasselbe Array verweist. Es wird kein neues Array erstellt.
Die Array-Syntax von C # ist flexibel. Sie können Arrays deklarieren, ohne sie zu initialisieren, damit das Array später im Programm dynamisch angepasst werden kann. Mit dieser Technik erstellen Sie im Grunde genommen eine Nullreferenz und verweisen diese Referenz später auf eine dynamisch zugewiesene Strecke von Speicherplätzen, die mit einem
new
Schlüsselwort angefordert werden :Danke.
quelle