Ich habe die C# -Sprachspezifikation durchsucht und kann nichts finden, das angibt, ob ein Zeigertyp (z. B. int*
) mit einem Standardwert initialisiert wird. Ich habe eine einfache Test-App erstellt und sie scheint sie auf Null zu initialisieren, aber ich möchte dies mit der Spezifikation bestätigen.C# Standardwert eines Zeigertyps
Ich begann dafür suchen, weil ich in Reflektor bemerkte die IntPtr
Klasse diesen Code verwendet, um seine definieren IntPtr.Zero
:
public struct IntPtr : ISerializable
{
private unsafe void* m_value;
public static readonly IntPtr Zero;
.......
public static unsafe bool operator ==(IntPtr value1, IntPtr value2)
{
return (value1.m_value == value2.m_value);
}
........
}
was bedeutet, dass, wenn Sie gegen IntPtr.Zero
vergleichen sie tatsächlich gegen den Standardwert vergleicht zugewiesen das Feld m_value
mit dem Typ void*
.
Danke.
Es gibt Teile der Spezifikation, die Zeiger diskutieren, die diskutieren, wie sie mit der Analyse definierter Zuordnung interagieren. Wenn man bedenkt, dass der Hauptzweck einer bestimmten Zuweisungsanalyse darin besteht, zu vermeiden, dass Sie einen nicht initialisierten Zustand einer Variablen beobachten, lautet die Antwort möglicherweise Mu. Außerdem ist nicht alles, was Sie bei der Implementierung von Framework-Typen sehen, die ganze Geschichte - manchmal erzeugt eine spezielle Behandlung durch die Runtime das tatsächliche Verhalten. –
Gut gefleckt ... sieht aus, als hätten sie es beim Schreiben der Spezifikation verpasst. Man kann annehmen, dass es null (null) ist :-) – buffjape
Was verwirrend ist, ist, dass CIL Zeigertypen als Teilmenge von Referenztypen definiert, aber C# definiert Zeigertypen als eigenständige Klasse von Typen. Wenn CIL angibt, dass Referenztypen den Standardwert "null" haben, bedeutet das mehr als wenn C# dasselbe angibt. – hvd