Frage

In Delphi, wenn es eine Ausnahme bei der Konstruktion eines Objekts ist: jeder zugewiesene Speicher freigegeben würde und eine Ausnahme ausgelöst werden würde. Zum Beispiel wurde die folgende garantiert , um entweder zurückgeben ein gültiges Camera ein Objekt oder eine Ausnahme auslösen:

Camera c = new Camera();

Sie nie hatte die resultierende Variable für null zu überprüfen:

Camera c = new Camera();
if (c == null)
   throw new Exception("Error constructing Camera") //waste of time

Ist das gleiche in der CLR wahr?

Und gibt es andere syntatical constucts wo ein Rückgabewert garantiert ist entweder gültig ist, oder eine Ausnahme auslösen?

  • Erstellen von Strukturen (zum Beispiel rechteckig)?
  • immer ein Mitglied einer Aufzählung?
  • das Ergebnis Object.ToString ()?
  • mathmatical Operationen?

Im Fall der Durchführung der Mathematik:

Int32 aspect = 1650.0 / 1080.0;
if (aspect == null) 
   throw new Exception("Division of two numbers returned null")
War es hilfreich?

Lösung

Ein Konstruktor in .Net ist garantiert eine Nicht-Null-Instanz des Typs des Objekts zurückzukehren. Unabhängig davon, ob die Instanz gültig , hängt von der individuellen Semantik des Typs.

Ausnahmen in einem Konstruktor geworfen werden nicht willkürlich von der CLR geschluckt werden (obwohl Benutzercode kann sie schlucken). Die CLR wird eine Ausnahme wie Ausnahmen in jeder anderen Methode geworfen propagieren und die Objekte werden schließlich richtig Müll gesammelt werden.

Wie bei den anderen Fällen, die Sie erwähnen

  • Erstellen von Strukturen: Strukturen per Definition immer nicht null sein. Ausnahmen im Konstruktor geworfen werden propagieren normalerweise
  • Erste ein Mitglied einer Aufzählung: Aufzählungen sind strutures / Werttypen unter der Haube und werden auch nicht immer null sein
  • das Ergebnis Object.ToString (): Das kann (und leider wird) null sein. String ist ein Referenz-Typ und es ist vollkommen legal null zurück von einer ToString Überschreibung (bitte nicht).
  • Mathematische Operationen: Das hängt stark sowohl von der Überlauf Einstellung des Projekts und der speziellen Art (Integral vs. floating point) verwendet wird.

Die mathematische Frage verdient fast eine Antwort auf seine eigenen. Auf der einen Seite ist das Ergebnis einer mathematischen Operation auf primitive Typen werden nicht immer null sein. Aber es kann immer noch ungültig. Zum Beispiel wird der folgende Code nicht werfen, aber ob das Ergebnis gültig ist, hängt stark von Ihrem spezifischen Szenario

float f1 = 1.0;
float f2 = f1 / 0;

An diesem Punkt f2 ist ein sehr spezifisch Gleitkommawert, nicht eine reelle Zahl darstellt. Ist es gültig? Hängt von Ihrem Anwendungsfall.

Andere Tipps

Ja. Ich mag es auf diese Weise setzen (wie fail könnte bedeuten, logische Versagen zu): Wenn ein Konstruktor keine Ausnahme wirft, wird der Rückgabewert garantiert sein nicht-null, so dass Sie nie eine solche Prüfung durchzuführen haben.

Erstellen von Strukturen (zum Beispiel rechteckig): A struct kann nicht auf allen null werden (Nullable Typen sind völlig verschiedene Arten betrachtet, das heißt typeof(int?) != typeof(int)). Der Aufruf eine Konstruktor für eine Struktur würde entweder nicht durch eine Ausnahme zu werfen oder eine Instanz zurück.

ein Mitglied einer Aufzählung bekommen: Ein enum ist nur eine Reihe von Konstanten. Es gibt nichts Vergleichbares „ein Mitglied zur Laufzeit zu bekommen.“ Es ist bei der Kompilierung ersetzt.

Das Ergebnis Object.ToString(): Wie jede Methode kann jeden gültigen Wert für string Typen zurück, die null enthält und auch eine Ausnahme auslösen könnte (in diesem Fall ist es nicht Wert überhaupt zurück)

.

Mathematische Operationen: Alle Ausdrücke einen Wert zurückgeben oder eine Ausnahme auslösen. Der Rückgabewert kann ein beliebiger gültiger Wert für diesen Typ sein (z Int32 nie null werden).

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