Heim Backend-Entwicklung C#.Net-Tutorial Was ist ein Konstruktor? Was ist der Referenztyp?

Was ist ein Konstruktor? Was ist der Referenztyp?

Jun 23, 2017 pm 03:14 PM

Referenztyp
Der Konstruktor ist eine spezielle Methode, um eine Instanz eines Typs in einen guten Zustand zu initialisieren. Beim Erstellen einer Instanz eines Referenztyps wird zunächst Speicher für die Datenfelder der Instanz zugewiesen. und dann die zusätzlichen Felder des Objekts (Typobjektzeiger und synchronisierter Blockindex) und ruft schließlich den Instanzkonstruktor des Typs auf, um den Initialisierungsstatus des Objekts festzulegen.
Beim Erstellen eines Referenztypobjekts wird der für das Objekt zugewiesene Speicher vor dem Instanzkonstruktor des Elektrophoresetyps immer auf 0 zurückgesetzt. Alle Felder, die vom Konstruktor nicht explizit überschrieben werden, erhalten garantiert 0 oder Null Werte. .
Im Gegensatz zu anderen Methoden kann der Stärkekonstruktor niemals vererbt werden, das heißt, die Klasse verfügt nur über den von der Klasse selbst definierten Glattkonstruktor. Da ein Instanzkonstruktor niemals vererbt werden kann, können die folgenden Modifikatoren nicht für einen Instanzkonstruktor verwendet werden: Virtual, New, Override, Sealed und Abstract. Wenn die Klasse keinen expliziten Konstruktor definiert, verwendet der C#-Compiler standardmäßig einen Parameterlosen Konstruktor. In seiner Implementierung ruft er einfach den Parameterlosen Konstruktor der Basisklasse auf.
Wenn der Modifikator der Klasse abstrakt ist, ist die Zugänglichkeit des vom Compiler generierten Standardkonstruktors Produkt; andernfalls erhält der Konstruktor das öffentliche Zugänglichkeitsattribut. Wenn die Basisklasse keinen parameterlosen Konstruktor bereitstellt, muss die abgeleitete Klasse explizit einen Basisklassenkonstruktor aufrufen, andernfalls meldet der Compiler einen Fehler. Wenn der Klassenmodifikator statisch (versiegelt und abstrakt) ist, generiert der Compiler überhaupt keinen Standardkonstruktor in der Klassendefinition.
Ein Typ kann mehrere Instanzkonstruktoren definieren. Jeder Konstruktor muss eine andere Signatur haben und jeder kann über unterschiedliche zugängliche Eigenschaften verfügen. Um den Code „überprüfbar“ zu machen, muss der Initialisierer der Klasse den Konstruktor der Basisklasse aufrufen, bevor er auf von der Basisklasse geerbte Felder zugreift. Wenn der abgeleitete Klassenkonstruktor nicht explizit einen Basisklassenkonstruktor aufruft, generiert der C#-Compiler automatisch einen Aufruf des Standardbasisklassenkonstruktors. Schließlich wird der öffentliche Konstruktor ohne Argumente von System.Object aufgerufen. Der Konstruktor tut nichts und gibt direkt zurück. Da System.Object keine Instanzdatenfelder hat, hat sein Konstruktor nichts zu tun.
In seltenen Fällen ist es möglich, eine Instanz eines Typs zu erstellen, ohne den Instanzkonstruktor aufzurufen. Ein typisches Beispiel ist die MemberwiseClone-Methode von Object. Diese Methode reserviert Speicher, initialisiert die zusätzlichen Felder des Objekts und kopiert dann die eigenen Daten des Quellobjekts in das neue Objekt. Darüber hinaus muss beim Deserialisieren eines Objekts mithilfe eines Laufzeitserialisierers nicht derselbe Prozess den Konstruktor aufrufen. Die Deserialisierung verwendet die Methode GetUnnitalizedObject oder GetSafeUninitailizedObject des Typs System.Runtime.Serialization.FormatterServices, um Speicher für das Objekt zu reservieren, und während des Prozesses wird kein Konstruktor aufgerufen.
Tipp:
Rufen Sie im Konstruktor keine virtuellen Methoden auf. Der Grund dafür ist, dass die Implementierung der virtuellen Methode durch den abgeleiteten Typ ausgeführt wird, wenn der instanziierte Typ die virtuelle Methode überschreibt. Zu diesem Zeitpunkt ist jedoch die Initialisierung aller Felder in der Vererbungshierarchie noch nicht abgeschlossen (der Konstruktor des instanziierten Typs). läuft noch nicht). Daher kann der Aufruf virtueller Methoden zu unvorhersehbarem Verhalten führen. Dies liegt letztlich daran, dass beim Aufruf einer virtuellen Methode der tatsächliche Typ, auf dem die Methode ausgeführt wird, erst zur Laufzeit ausgewählt wird.
Werttyp-Konstruktor (Struktur)
Der Werttyp-Konstruktor (Struktur) funktioniert völlig anders als der Referenztyp-Konstruktor (Klasse). Die CLR erlaubt immer die Erstellung von Instanzen von Werttypen, und es gibt keine Möglichkeit, die Instanziierung von Werttypen zu verhindern. Daher müssen Werttypen eigentlich keinen Konstruktor definieren, und der C#-Compiler integriert überhaupt keinen Standardkonstruktor ohne Argumente für Werttypen. Schauen wir uns den folgenden Code an:
internal struct Point {
public int m_x, m_y;
}
internal versiegelt class Reactangel
{
public Point m_TopLeft, m_bottomRight;
}
Um ein Rechteck zu konstruieren, müssen der neue Operator und der Konstruktor verwendet werden muss angegeben werden. In diesem Beispiel wird der vom C#-Compiler automatisch generierte Standardkonstruktor aufgerufen. Reservieren Sie Speicher für Reatangle, das zwei Instanzen des Point-Werttyps enthält. Aus Leistungsgründen ruft die CLR den Konstruktor nicht für jedes im Referenztyp enthaltene Werttypfeld auf. Wie bereits erwähnt, werden die Werttypfelder jedoch auf 0 oder null initialisiert.
Die CLR ermöglicht zwar die Definition von Konstruktoren für Werttypen, sie müssen jedoch explizit aufgerufen werden, damit sie ausgeführt werden können.
internal struct Point {
public int m_x, m_y;
public Point(int x, int y)
{
m_x = x;
m_y = y;
}
}
interne versiegelte Klasse Reactangel
{
public Point m_TopLeft, m_bottomRight;
public Reactangel()
{
this.m_TopLeft = new Point(1 ,2);
this.m_bottomRight = new Point(100,200);
}
}
Instanzkonstruktoren von Werttypen werden nur ausgeführt, wenn sie explizit aufgerufen werden. Wenn der Konstruktor von Rechteck daher nicht den neuen Operator verwendet, um den Konstruktor von Point aufzurufen, um die Felder m_TopLeft und m_bottomRight von Reatangle zu initialisieren, sind die Felder m_x und m_y in beiden Punktfeldern 0.
Neu schreiben der obige Code:
internal struct Point {
public int m_x, m_y;
public Point()
{
m_x = 5;
m_y = 6;
}
}
interne versiegelte Klasse Reactangel
{
public Point m_TopLeft, m_bottomRight;
public Reactangel()
{
}
}
Wie stark werden nun beim Erstellen einer neuen Rechteckklasse die Felder m_x und m_y in den beiden Punktfeldern initialisiert? Ist es 0 oder 5?
Vielleicht denken Sie, dass der C#-Compiler Code im Konstruktor von Reactangel generiert und automatisch Points Standardkonstruktor ohne Argumente für die beiden Felder von Reactangel aufruft. Um die Laufzeitleistung Ihrer Anwendung zu verbessern, generiert der C#-Compiler solchen Code jedoch nicht automatisch. Selbst wenn ein Werttyp einen Konstruktor ohne Parameter bereitstellt, generieren viele Compiler niemals Code, um ihn aufzurufen. Um einen Konstruktor ohne Parameter für den Werttyp zu implementieren, muss der Entwickler Code hinzufügen, der den Konstruktor für den Werttyp explizit aufruft. Aber werden die beiden Felder von Point' aus diesem Grund auf 0 initialisiert? Das Ergebnis ist:
Der C#-Compiler lässt bewusst nicht zu, dass Werttypen Parameterlose Konstruktoren definieren, um dies zu ermöglichen verhindern Entwickler sind verwirrt darüber, wann dieser Konstruktor aufgerufen wird. Da ein Parameterloser Konstruktor nicht definiert werden kann, generiert der Compiler niemals Code, der ihn automatisch aufruft. Ohne einen Parameterlosen Konstruktor werden Felder von Werttypen immer auf 0 oder Null initialisiert.
Typkonstruktor:
wird auch als statischer Konstruktor, Klassenkonstruktor oder Typinitialisierer bezeichnet. Typkonstruktoren können mit Referenztypen und Werttypen verwendet werden. Der Zweck eines Instanzkonstruktors besteht darin, den Anfangszustand einer Instanz eines Typs festzulegen. Dementsprechend besteht die Rolle des Typkonstruktors darin, den Anfangszustand des Typs festzulegen. Der Typ definiert standardmäßig keinen Typkonstruktor. Wenn er definiert ist, kann es nur einen geben. Darüber hinaus verfügen Typkonstruktoren niemals über Parameter.
interne versiegelte Klasse SomeRefType {
statische SomeRefType()
{
//Beim ersten Besuch führen Sie den Code hier aus
}
}
interne Struktur SomeValType
{
statische SomeValType()
{
//Beim ersten Besuch führen Sie den Code hier aus
}
}
Es ist ersichtlich, dass die Definition eines Typkonstruktors ähnlich ist zum Definieren eines parameterlosen Instanzkonstruktors. Der Unterschied besteht darin, dass er als statisch markiert sein muss. Darüber hinaus sind Typkonstruktoren immer privat. Der Grund dafür, dass es privat ist, besteht darin, zu verhindern, dass Entwickler Code schreiben, um es aufzurufen, und die CLR ist immer für seine Aufrufe verantwortlich.
Tipp:
Obwohl Sie einen Typkonstruktor in einem Werttyp definieren können, sollten Sie dies eigentlich nie tun, da die CLR manchmal den statischen Konstruktor des Werttyps nicht aufruft: zum Beispiel
internal struct SomeValType
{
static SomeValType()
{
Console.WriteLine("Dieser Satz wird nie angezeigt" ). ( string[] args)
{
SomeValType[] a = new SomeValType[10];
a[0].m_x = 123;
Console.WriteLine(a[0].m_x);
Console.ReadKey();
}
}
Der Code des Typs Nur Konstruktor Kann auf die statischen Felder eines Typs zugreifen und seine unkonventionelle Verwendung besteht darin, diese Felder zu initialisieren.

Das obige ist der detaillierte Inhalt vonWas ist ein Konstruktor? Was ist der Referenztyp?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie man verschiedene Symbole in der C -Sprache verwendet Wie man verschiedene Symbole in der C -Sprache verwendet Apr 03, 2025 pm 04:48 PM

Die Nutzungsmethoden von Symbolen in der C-Sprachabdeckung Arithmetik, Zuordnung, Bedingungen, Logik, Bitoperatoren usw. werden für grundlegende mathematische Operationen verwendet, Zuordnungsoperatoren werden zur Zuordnung und Addition verwendet, Subtraktion, Multiplikationszuordnung und Abteilungszuweisung, Zustandsbetreiber werden für Unterschiede verwendet. Logische Operationen werden verwendet. Logische Operationen werden verwendet. Logische Operationen werden verwendet. Zeiger, Markierungen am Ende der Datei und nicht numerische Werte.

Was ist die Rolle von CHAR in C -Saiten? Was ist die Rolle von CHAR in C -Saiten? Apr 03, 2025 pm 03:15 PM

In C wird der Zeichenentyp in Saiten verwendet: 1. Speichern Sie ein einzelnes Zeichen; 2. Verwenden Sie ein Array, um eine Zeichenfolge darzustellen und mit einem Null -Terminator zu enden. 3. Durch eine Saitenbetriebsfunktion arbeiten; 4. Lesen oder geben Sie eine Zeichenfolge von der Tastatur aus.

Der Unterschied zwischen Multithreading und asynchronem C# Der Unterschied zwischen Multithreading und asynchronem C# Apr 03, 2025 pm 02:57 PM

Der Unterschied zwischen Multithreading und Asynchron besteht darin, dass Multithreading gleichzeitig mehrere Threads ausführt, während asynchron Operationen ausführt, ohne den aktuellen Thread zu blockieren. Multithreading wird für rechenintensive Aufgaben verwendet, während asynchron für die Benutzerinteraktion verwendet wird. Der Vorteil des Multi-Threading besteht darin, die Rechenleistung zu verbessern, während der Vorteil von Asynchron nicht darin besteht, UI-Threads zu blockieren. Die Auswahl von Multithreading oder Asynchron ist von der Art der Aufgabe abhängt: Berechnungsintensive Aufgaben verwenden Multithreading, Aufgaben, die mit externen Ressourcen interagieren und die UI-Reaktionsfähigkeit asynchron verwenden müssen.

So verwenden Sie char Array in C -Sprache So verwenden Sie char Array in C -Sprache Apr 03, 2025 pm 03:24 PM

Das Char -Array speichert Zeichensequenzen in der C -Sprache und wird als char Array_name [Größe] deklariert. Das Zugriffselement wird durch den Einweisoperator weitergeleitet, und das Element endet mit dem Null -Terminator '\ 0', der den Endpunkt der Zeichenfolge darstellt. Die C -Sprache bietet eine Vielzahl von String -Manipulationsfunktionen wie Strlen (), Strcpy (), Strcat () und strcmp ().

Wie man mit Sonderfiguren in der C -Sprache umgeht Wie man mit Sonderfiguren in der C -Sprache umgeht Apr 03, 2025 pm 03:18 PM

In der C -Sprache werden Sonderzeichen durch Escape -Sequenzen verarbeitet, wie z. B.: \ n repräsentiert Linienbrüche. \ t bedeutet tab charakter. Verwenden Sie Escape -Sequenzen oder Zeichenkonstanten, um Sonderzeichen darzustellen, wie z. B. char c = '\ n'. Beachten Sie, dass der Backslash zweimal entkommen muss. Verschiedene Plattformen und Compiler haben möglicherweise unterschiedliche Fluchtsequenzen. Bitte wenden Sie sich an die Dokumentation.

Wie man CHO in C -Sprache umwandelt Wie man CHO in C -Sprache umwandelt Apr 03, 2025 pm 03:21 PM

In der C -Sprache kann die char -Typ -Konvertierung direkt in einen anderen Typ konvertiert werden, wenn: Casting: Verwenden von Casting -Zeichen. Automatische Konvertierung des Typs: Wenn ein Datentyp einen anderen Werttyp berücksichtigen kann, wandelt der Compiler diese automatisch um.

Der Unterschied zwischen char und wchar_t in der C -Sprache Der Unterschied zwischen char und wchar_t in der C -Sprache Apr 03, 2025 pm 03:09 PM

In der C -Sprache ist der Hauptunterschied zwischen char und wchar_t die Zeichencodierung: char verwendet ASCII oder erweitert ASCII, wchar_t Unicode; char nimmt 1-2 Bytes auf, wchar_t nimmt 2-4 Bytes auf; char ist für englischen Text geeignet. Wchar_t ist für mehrsprachige Text geeignet. char ist weithin unterstützt, wchar_t hängt davon ab, ob der Compiler und das Betriebssystem Unicode unterstützen. char ist in der Charakterbereich begrenzt, WCHAR_T hat einen größeren Charakterbereich und spezielle Funktionen werden für arithmetische Operationen verwendet.

Was ist die Funktion der C -Sprachsumme? Was ist die Funktion der C -Sprachsumme? Apr 03, 2025 pm 02:21 PM

Es gibt keine integrierte Summenfunktion in der C-Sprache, daher muss sie selbst geschrieben werden. Die Summe kann erreicht werden, indem das Array durchquert und Elemente akkumulieren: Schleifenversion: Die Summe wird für die Schleifen- und Arraylänge berechnet. Zeigerversion: Verwenden Sie Zeiger, um auf Array-Elemente zu verweisen, und eine effiziente Summierung wird durch Selbststillstandszeiger erzielt. Dynamisch Array -Array -Version zuweisen: Zuordnen Sie Arrays dynamisch und verwalten Sie selbst den Speicher selbst, um sicherzustellen, dass der zugewiesene Speicher befreit wird, um Speicherlecks zu verhindern.

See all articles