An InvalidOperationException ist Was würde ich in diesem Fall verwenden, weil der Zugriff auf die Eigenschaft nicht für den aktuellen Zustand des Objekts gültig ist.
Laut MSDN-Dokumentation:
"Die Ausnahme, die ausgelöst wird, wenn ein Methodenaufruf für den aktuellen Status des Objekts ungültig ist."
auch:
"InvalidOperationException wird in Fällen verwendet, in denen der Fehler beim Aufrufen einer Methode auf andere Gründe als ungültige Argumente zurückzuführen ist."
In diesem Fall ist obj kein Argument, weshalb ich auf "InvalidOperationException"
lehnen würdeDer Grund, warum ich hier keine NullReferenceException werfen würde: Wenn Sie keinen speziellen Code hinzufügen, ist das die Ausnahme, die ".Net" werfen würde. Warum also redundanten Code hinzufügen?
Sie sollten keine NullReferenceException werfen. Es ist für Situationen reserviert, in denen ein Nullobjekt dereferenziert wird. Wenn Sie in diesem Fall NullReference werfen, können Sie auch einfach den Null-Check verlassen und das Framework für Sie freigeben lassen, wenn Sie versuchen, auf den Namen des Objekts zuzugreifen.
Ich würde stattdessen InvalidOperationException auslösen.
Wenn Sie nicht irgendwo sagen, dass diese Eigenschaft nie null sein wird, warum sollten Sie eine Ausnahme auslösen?
Wenn Sie das gesagt haben, würde ich eine InvalidOperationException
.
InvalidOperationException
ist
Die Ausnahme, die ausgelöst wird, wenn a Methodenaufruf ist ungültig für die aktueller Status des Objekts.
Jeder hat das Offensichtliche abgedeckt, also hier ist eine andere Option.
Wenn Ihre Klasse auf irgendeine Weise initialisiert werden muss (Ihr SomeObject
muss irgendwann gesetzt werden), sollten Sie in Erwägung ziehen, ISupportInitialize . Dies zeigt Benutzern Ihrer Klasse an, dass sie sich vor dem Aufruf von EndInit()
nicht in einem gültigen Status befindet. Leider gibt es kein vorheriges allgemeines NotInitializedException
, das Sie verwenden können (es gibt einige, die aber für bestimmte Namespaces spezifisch sind), daher würde ich vorschlagen, Ihre Implementierung der Schnittstelle mit der Erstellung einer solchen Ausnahme zu paaren.
Benutzer müssen zuerst BeginInit()
aufrufen, dann die Instanz konfigurieren und dann EndInit()
aufrufen. Überprüfen Sie beim Aufruf von EndInit()
den Status Ihrer Instanz. Wenn es nicht korrekt initialisiert wird, können Sie eine InvalidOperationException auslösen. Wenn Benutzer versuchen, Ihre Instanz vor der Initialisierung zu verwenden, würden Sie Ihre NotInitializedException auslösen.
Es ist ein bisschen mehr Arbeit, aber der Vorteil ist, dass Sie eine breitere "Grube des Erfolges" für Ihre Benutzer schaffen, um sicherzustellen, dass sie Ihre Klassen richtig verwenden, indem sie schnell und früh ausfallen, und durch die Definition Ihres Typs Schnittstelle ist ziemlich klar, was Sie erwarten). Es gibt Ihnen auch mehr "Raum", um zu dokumentieren, wie Ihre Klasse verwendet werden sollte.
Ich würde ein InvalidOperationException
werfen, aber nur wenn:
- Es ist zulässig, dass obj
null
ist, und es liegt in der Verantwortung des Benutzers, dies zu überprüfen, oder
- Es ist nicht zulässig, dass obj
zuerst null
ist (d. h. obj != null
ist eine Klasseninvariante)
Wenn keiner der obigen Fälle der Fall ist (das heißt, es ist legal, dass obj
null
ist und Benutzercode nicht explizit erforderlich ist, um dies zu überprüfen, bevor die Eigenschaft verwendet wird), würde ich nicht werfen Sie überhaupt, aber geben Sie null
zurück.
Wenn Sie sich den von Ihnen bereitgestellten Code anschauen und nichts über Ihre Designannahmen wissen, würde ich sagen, dass Sie obj == null
überhaupt nicht testen sollten und das Framework ein NullReferenceException
werfen lassen sollte. Warum willst du diesen Test? Ein Grund, an den ich denken könnte, ist, dass Sie eine aussagekräftigere Fehlermeldung zum Debuggen haben möchten, aber dann sollten Sie Debug.Assert(obj != null, "Your message here")
verwenden.
Ich würde den Entwurf erneut besuchen, so dass dieser Zustand nicht in erster Linie existieren kann, d. h. obj ist null. Im Allgemeinen sollte man aus Sicht der API in der Lage sein, einen Getter in gutem Glauben aufzurufen, dass er nicht explodieren wird, wenn sich das Objekt in einem unbekannten Zustand befindet.
Warum haben Sie zum Beispiel 'SomeObject obj' nicht als Konstruktorparameter und verwenden Argumentvalidierung zum Zeitpunkt der Konstruktion. Dadurch wird sichergestellt, dass der Zustand von 'obj' immer korrekt ist, d. H. Nach der Konstruktion nicht null ist.
Es gibt viele Muster, die verwendet werden können, um sicherzustellen, dass ein Objekt einen korrekten Status hat, wenn es für den Benutzer verfügbar wird.