Sie haben hier nur eine Frage gestellt, aber es gibt ungefähr ein Dutzend Fragen, die Sie hätten stellen sollen, also werde ich sie alle beantworten.
Hier ist die Reihenfolge, die ich angenommen habe
- Start des Klassenkonstruktors (auch bekannt als
cctor
)
- Ende des Cctors
- Start von Main
- Start von MyMethod
Ist das richtig?
Nein. Die richtige Reihenfolge ist:
- Start von cctor für Programm, falls vorhanden. Da ist nicht.
- Ende des Programms für das Programm, falls vorhanden. Da ist nicht.
- Start von Main
- Start von cctor für MyClass
- Ende von cctor für MyClass
- Start von MyClass.MyMethod
Was ist, wenn ein statischer Feldinitialisierer vorhanden ist?
Die CLR kann in einigen Fällen die Reihenfolge ändern, in der statische Feldinitialisierer ausgeführt werden. Siehe Jons Seite zu diesem Thema für Details:
Die Unterschiede zwischen statischen Konstruktoren und Typinitialisierern
Ist es jemals möglich, eine statische Methode MyMethod
aufzurufen, bevor der Cctor dieser Klasse abgeschlossen ist?
Ja. Wenn der Cctor selbst MyMethod aufruft, wird MyMethod offensichtlich aufgerufen, bevor der Cctor abgeschlossen ist.
Der Cctor ruft MyMethod nicht auf. Ist es jemals möglich, eine statische Methode MyMethod
aufzurufen, bevor der Cctor von MyClass abgeschlossen ist?
Ja. Wenn der Cctor einen anderen Typ verwendet, dessen Cctor MyMethod aufruft, wird MyMethod aufgerufen, bevor der MyClass-Cctor abgeschlossen ist.
Kein Arzt ruft MyMethod direkt oder indirekt auf! MyMethod
Ist es jemals möglich, eine statische Methode aufzurufen, bevor der Cctor von MyClass abgeschlossen ist?
Nein.
Gilt das auch dann noch, wenn mehrere Threads beteiligt sind?
Ja. Der Cctor wird in einem Thread beendet, bevor die statische Methode in einem Thread aufgerufen werden kann.
Kann der Cctor mehrmals aufgerufen werden? Angenommen, zwei Threads bewirken, dass der Cctor ausgeführt wird.
Der Cctor wird garantiert höchstens einmal aufgerufen, egal wie viele Threads beteiligt sind. Wenn zwei Threads MyMethod "gleichzeitig" aufrufen, laufen sie. Einer von ihnen verliert das Rennen und blockt, bis der MyClass-Cctor den Sieger-Thread abgeschlossen hat.
Der verlorene Faden blockiert, bis der Cctor fertig ist? Wirklich ?
Ja wirklich.
Was ist, wenn der Cctor im Gewinner- Thread Code aufruft, der eine Sperre blockiert, die zuvor vom Verlust- Thread übernommen wurde?
Dann haben Sie eine klassische Umkehrbedingung für die Sperrreihenfolge. Ihr Programm blockiert. Für immer.
Das scheint gefährlich. Wie kann ich den Deadlock vermeiden?
Wenn es weh tut, wenn Sie das tun, dann hören Sie damit auf . Tun Sie niemals etwas, das einen Cctor blockieren kann.
Ist es eine gute Idee, sich auf die Semantik der Cctor-Initialisierung zu verlassen, um komplexe Sicherheitsanforderungen durchzusetzen? Und ist es eine gute Idee, einen Cctor zu haben, der Benutzerinteraktionen durchführt?
Weder sind gute Ideen. Mein Rat ist, dass Sie einen anderen Weg finden sollten, um sicherzustellen, dass die sicherheitsrelevanten Voraussetzungen Ihrer Methoden erfüllt sind.