Was ist die richtige .NET-Ausnahme, die ausgelöst werden soll, wenn versucht wird, ein doppeltes Objekt in eine Sammlung einzufügen?

StackOverflow https://stackoverflow.com/questions/54789

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe ein Asset-Objekt mit der Eigenschaft AssignedSoftware, bei der es sich um eine Sammlung handelt.

Ich möchte sicherstellen, dass dieselbe Software einem Asset nicht mehr als einmal zugewiesen wird.In der Add-Methode überprüfe ich, ob die Software bereits vorhanden ist, und wenn ja, möchte ich eine Ausnahme auslösen.

Gibt es eine Standard-.NET-Ausnahme, die ich auslösen sollte?Oder schreiben Best Practices vor, dass ich meine eigene benutzerdefinierte Ausnahme erstelle?

War es hilfreich?

Lösung

Von der Klassenbibliothek Design-Richtlinien für Fehler ( http: //msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx ):

  

In den meisten Fällen verwenden die vordefinierten Ausnahmetypen. definieren Nur neue Ausnahmetypen für programmatische Szenarien, in denen Sie Benutzer Ihrer Klassenbibliothek erwarten Ausnahmen von dieser neuen Art zu fangen und führen selbst eine programmatische Aktion auf der Grundlage der Ausnahmetyp. Dies gilt anstelle der Ausnahme String Parsen, die sich negativ auf die Leistung auswirken würde und Wartung.

     

...

     

ein Argument werfen oder eine Ausnahme von dieser Klasse abgeleitet erstellen, wenn ungültige Parameter übergeben werden oder erkannt wird.

     

Werfen Sie die InvalidOperationException Ausnahme, wenn ein Anruf zu einem Objekt Accessor oder Verfahren nicht geeignet ist, das aktuelle Zustand des Objekts angegeben.

Das scheint wie ein „Objektzustand ungültig“ -Szenario zu mir, so würde ich InvalidOperationException über Argument wählen: Die Parameter sind gültig, aber nicht an diesem Punkt im Leben Objekte

.

Andere Tipps

Warum hat InvalidOperationException wurde als Antwort akzeptiert ?! Es sollte ein ArgumentException sein?!

InvalidOperationException sollte verwendet werden, wenn das Objekt die Methode / Eigenschaft gegen sie aufgerufen, die nicht in der Lage ist, mit der Bitte, wegen uninit'ed Zustand fertig zu werden usw. Das Problem hierbei ist nicht das Objekt hinzugefügt, aber die Objekt auf das Objekt übergeben wird (es ist ein dupe). Denken sie darüber nach, wenn dieser Anruf hinzufügen nie stattgefunden hat, würde immer noch das Objekt als normal funktionieren, YES!

Dies sollte ein sein Argument .

.Net eine System.ArgumentException werfen, wenn Sie versuchen, ein Element zu einer Hash-Tabelle zweimal mit dem gleichen Schlüsselwert hinzuzufügen, so dass er tut es aussehen ist etwas präziser. Vielleicht möchten Sie Ihre eigene Ausnahme schreiben, wenn Sie etwas speziellere benötigen.

Sie sollten wahrscheinlich Argument werfen, wie das ist, was die Basisbibliotheksklassen zu tun.

Nun, wenn Sie wirklich eine Sammlung mit Unikaten wollen, könnten Sie einen Blick auf die HashSet Objekt (erhältlich in C # 3.0).

Ansonsten gibt es zwei Ansätze, die Sie ergreifen können:

  • Erstellen Sie eine benutzerdefinierte Ausnahme für Ihren Betrieb, wie Sie gesagt haben
  • Implementieren Sie ein Add () -Methode, die ein boolean Ergebnis zurückgibt: true, wenn das Element hinzugefügt wird und falsch, wenn das Element bereits ein Duplikat in der Sammlung hat

Jeder Ansatz lässt sich am besten Praxis, nur so lange gelten, wie Sie in der Anwendung konsistent sind.

Ich habe immer gerne die InvalidOperationException. Allerdings könnten Sie auch eine benutzerdefinierte Ausnahme erstellen, sagen wir ein DuplicateSoftwareAssignmentException.


Von den Rahmen-Design-Richtlinien:

  

"ein Argument Werfen oder erstellen   Eine Ausnahme von dieser Klasse abgeleitet   wenn ungültige Parameter übergeben oder   nachgewiesen werden.

     

Werfen Sie die InvalidOperationException   Ausnahme, wenn ein Anruf zu einem Objekt   Accessor oder Verfahren nicht geeignet ist   angesichts der aktuellen Zustand des Objekts. "

Der aktuelle Zustand enthält Verweise auf andere Klasseninstanzen. In diesem Fall weist der Staat bereits ein Verweis auf die Instanz hinzugefügt werden, damit der Aufruf der Methode ungeeignet ist.

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