Warum existiert NotImplementedException?
Dieses wirklich urks mich, so dass ich hoffe, jemand kann mir eine vernünftige Begründung dafür, warum die Dinge so sind wie Sie sind.
NotImplementedException. Sie zieht mein Bein, richtig?
Nein, ich werde nicht nehmen Sie die günstigen stechen um dies mit den Worten, "halt, die Methode implementiert ist - es eine NotImplementedException." Ja, das stimmt, Sie implementieren müssen, um die Methode zu werfen, eine NotImplementedException (im Gegensatz zu einer rein virtueller Funktionsaufruf in C++ - nun, das macht Sinn!). Zwar ist das verdammt lustig, es ist ein ernstes problem in meinem Kopf.
Nur Frage ich mich, in Anwesenheit des NotImplementedException, wie kann jemand tun, nichts mit .Net? Sind Sie voraussichtlich wickeln Sie jede abstrakte Methode-Aufruf mit einem try-catch-block zum Schutz gegen die Methoden, die möglicherweise nicht umgesetzt werden? Wenn Sie fangen eine solche Ausnahme, was zum Teufel soll man tun??
Sehe ich keine Möglichkeit zu testen, ob eine Methode tatsächlich umgesetzt wird, ohne ihn aufzurufen. Da ruft es Nebenwirkungen haben können, kann ich nicht alle meine Prüfungen vor und führen Sie dann meinen Algorithmus. Ich habe meinen Algorithmus, fangen NotImplementedExceptions und das einige, wie " roll back meine Anwendung an einem sauberen Zustand.
Es ist verrückt. Mad. Wahnsinn. Die Frage ist also: Warum die NotImplementedException existieren?
Als Präventivschlag, ich möchte nicht, dass jemand zu Antworten, "da müssen Designer stellen diese in den automatisch generierten code." Das ist schrecklich. Ich würde lieber den automatisch generierten code nicht kompilieren, bis Sie liefern eine Implementierung. Zum Beispiel, die automatische Umsetzung könnte sein "werfen NotImplementedException;" wo die NotImplementedException ist nicht definiert!
Hat jemand schon abgefangen und behandelt eine NotImplementedException? Haben Sie jemals hinterließ eine NotImplementedException in deinem code? Wenn ja, hat diese repräsentieren eine Zeit-Bombe (dh, Sie versehentlich verlassen es gibt), oder ein design Fehler (sollte die Methode nicht implementiert werden und wird nie mehr aufgerufen werden)?
Ich bin sehr misstrauisch gegenüber der NotSupportedException auch... Nicht unterstützt? Was das? Wenn es nicht unterstützt wird, warum ist es Teil Ihrer Schnittstelle? Kann mir jemand bei Microsoft Zauber unsachgemäße Vererbung? Aber ich könnte beginnen, eine andere Frage für, wenn ich nicht bekommen, auch Missbrauch.
Zusätzliche info:
Diese ist eine interessante Lektüre zu dem Thema.
Scheint es eine starke übereinstimmung mit Brad Abramsdass "NotImplementedException ist für die Funktionalität, die ist nur noch nicht implementiert, aber eigentlich sollte (und wird). So etwas wie, was Sie vielleicht start mit, wenn Sie erstellen eine Klasse, alle Methoden, es zu werfen NotImplementedException, dann Spülen Sie diese mit dem echten code..."
Kommentare von Jared Parsons sind sehr schwach und sollte wohl ignoriert werden: NotImplementedException: Werfen Sie diese Ausnahme, wenn ein Typ nicht implementieren Sie eine Methode aus einem anderen Grund.
Den MSDN ist sogar noch schwächer auf das Thema, lediglich besagt, dass, "die Ausnahme, Die ausgelöst wird, wenn eine angeforderte Methode oder Vorgang ist nicht implementiert."
InformationsquelleAutor der Frage Daniel Paull | 2009-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine situation, die ich nützlich finden: TDD.
Schreibe ich meine Prüfungen, dann Erzeuge ich stubs, so dass die tests kompilieren. Diese stubs nichts zu tun, sondern
throw new NotImplementedException();
. Auf diese Weise werden die tests fehlschlagen, standardmäßig, egal was. Wenn ich "dummy" - Rückgabewert könnte es erzeugen false positives. Nun, dass alle tests kompilieren und scheitern, weil es keine Implementierung, die ich bekämpfen diese stubs.Da ich nie ein
NotImplementedException
in jeder anderen situation, keineNotImplementedException
je pass auf Freigabe-code, da wird es immer machen Sie einige test fehlschlagen.Brauchen Sie nicht, um es zu fangen alle über dem Platz. Gute APIs Dokument die Ausnahmen geworfen. Das sind die, die Sie suchen sollten.
EDIT: ich schrieb eine FxCop Regel, um Sie zu finden.
Dies ist der code:
- Und dies ist die Regel-Metadaten:
Aufzubauen, brauchen Sie:
Referenz
Microsoft.FxCop.Sdk.dll
undMicrosoft.Cci.dll
Legen Sie die Metadaten in eine Datei namens
DesignRules.xml
und fügen Sie es als eingebettete Ressource der assemblyNamen Ihrer Versammlung
Bevonn.CodeAnalysis
. Wenn Sie möchten, verwenden Sie unterschiedliche Namen für die Metadaten oder die assembly-Dateien, stellen Sie sicher, dass der zweite parameter der Basis-Konstruktor entsprechend.Dann einfach fügen Sie die resultierende assembly auf Ihrer FxCop-Regeln, und diese verdammten Ausnahmen Ihre kostbare code. Es gibt einige Ausnahmefälle, wo es nicht Bericht eine NotImplementedException, wenn man geworfen wird, aber ich glaube wirklich, Sie sind hoffnungslos, wenn Sie tatsächlich das schreiben solcher cthulhian code. Für den normalen verwendet, also
throw new NotImplementedException();
es funktioniert, und das ist alles was zählt.InformationsquelleAutor der Antwort R. Martinho Fernandes
Es ist halt ein relativ üblicher Fall, funktioniert, aber nur teilweise abgeschlossen API. Angenommen, ich möchte die Entwickler zu testen und zu bewerten, meine API -
WashDishes()
funktioniert, zumindest auf meinem Rechner, aber ich habe nicht bekommen, um noch zu Codierung bisDryDishes()
geschweige dennPutAwayDishes()
. Eher als leise ausfällt oder ich einige kryptische Fehlermeldung, ich kann ganz klar darüber, warumDryDishes()
funktioniert nicht - ich habe noch nicht realisiert es noch.Seine Schwester Ausnahme
NotSupportedException
Sinn meist für Anbieter Modelle. Viele Spülmaschinen haben eine trocknende Funktion, so gehört in die Schnittstelle, aber mein Rabatt Spülmaschine unterstützt es nicht. Ich kann das sein lassen, bekannt über dieNotSupportedException
InformationsquelleAutor der Antwort Scott Weinstein
Ich fasse meine Ansichten über dies an einem Ort, da Sie verstreut ein paar Kommentare:
Verwenden Sie
NotImplementedException
zu zeigen, dass eine Schnittstelle Mitglied ist noch nicht implementiert, werden es aber sein. Kombinieren Sie diese mit automatisierten unit-Tests oder QA-Test zum identifizieren von features, die noch umgesetzt werden müssen.Sobald das feature implementiert ist, entfernen Sie die
NotImplementedException
. Neue unit-tests geschrieben werden, die für die Funktion, um sicherzustellen, dass es ordnungsgemäß funktioniert.NotSupportedException
ist in der Regel für die Anbieter, die unterstützen keine Funktionen, die nicht Sinn machen, für bestimmte Arten. In diesen Fällen, die bestimmte Arten werfen die Ausnahme, die Kunden zu fangen und behandeln Sie diese entsprechend.Dem Grund, dass beide
NotImplementedException
undNotSupportedException
existieren im Framework ist einfach: die Situationen, die zu Ihnen führen, sind Häufig, so macht es Sinn, Sie zu definieren, die im Rahmen, so dass sich Entwickler nicht ständig neu definieren. Auch, es macht es einfach für die Kunden zu wissen, die Ausnahme zu fangen (vor allem im Rahmen eines unit-test). Wenn Sie zum definieren Ihrer eigenen Ausnahme, Sie haben, um herauszufinden, die Ausnahme zu fangen, das ist zumindest ein Zähler-produktive Zeit sinken, und Häufig falsch.InformationsquelleAutor der Antwort Mike Hofer
NotImplementedException ist eine großartige Möglichkeit, zu sagen, dass etwas noch nicht fertig ist. Warum es nicht bereit ist, eine eigene Frage für die Methode der Autoren. In der Produktion code, den Sie sind unwahrscheinlich, dass diese Ausnahme abfangen, aber wenn Sie haben Sie können sofort sehen, was passiert, und es ist viel besser, als zu versuchen, um herauszufinden, warum Methoden genannt wurde, aber nichts passiert oder noch schlimmer - Sie erhalten einige "vorübergehend" Ergebnisse und "lustige" Nebenwirkungen.
Nein, .NET hat NotSupportedException
Gute API hat die XML-Methoden-Dokumentation, die beschreibt mögliche Ausnahmen.
Kann es Millionen Gründe. Zum Beispiel können Sie die neue version der API und nicht wollen/können nicht unterstützen, die alten Methoden. Wieder, es ist viel besser zu sehen, beschreibende Ausnahme und nicht dann, Graben in der Dokumentation oder debugging 3rd-party-code.
InformationsquelleAutor der Antwort aku
Den wichtigsten nutzen für eine NotImplementedException Ausnahme ist das generierte stub-code: so dass Sie nicht vergessen, es zu realisieren!! Zum Beispiel, Visual Studio wird explizit eine Schnittstelle implementieren, die Methoden/Eigenschaften, die mit dem Körper werfen eine NotImplementedException.
InformationsquelleAutor der Antwort Mitch Wheat
Re
NotImplementedException
- dies dient ein paar Zwecke verwendet werden. es bietet eine einzige Ausnahme, dass (zum Beispiel) Ihre unit-tests kann die Schleuse auf für die unvollständige Arbeit. Aber auch, es wirklich zu tun, was Sie sagt: diese einfach nicht da ist (noch) nicht. Zum Beispiel, "mono" wirft diese alle über den Ort für die Methoden, die vorhanden sind in die MS-libs, aber noch nicht geschrieben.Re
NotSupportedException
- nicht alles, was verfügbar ist. Zum Beispiel, viele Schnittstellen, die Unterstützung von ein paar "können Sie dies tun?" /"dies ist". Wenn die "können Sie dies tun?" gibt false zurück, ist es durchaus sinnvoll für das "tun" zu werfenNotSupportedException
. Beispiele könnten seinIBindingList.SupportsSearching
/IBindingList.Find()
etc.InformationsquelleAutor der Antwort Marc Gravell
Meisten Entwickler bei Microsoft sind vertraut mit design-mustern, in denen eine NotImplementedException geeignet ist. Es ist ziemlich normal eigentlich.
Ein gutes Beispiel ist ein Composite-Musterwo viele Objekte behandelt werden kann, als eine einzelne Instanz eines Objekts. Eine Komponente wird als Basis verwendet abstrakte Klasse für (richtig) vererbt leaf-Klassen. Zum Beispiel, eine Datei-und Directory-Klasse Erben können von der gleichen abstrakten Klasse, weil Sie sehr ähnliche Arten. Auf diese Weise können Sie behandelt werden wie ein einzelnes Objekt (was Sinn macht, wenn Sie darüber nachdenken, welche Dateien und Verzeichnisse in Unix zum Beispiel, alles ist eine Datei).
So, in diesem Beispiel, es wäre eine GetFiles () - Methode der Directory-Klasse, aber die File-Klasse implementiert diese Methode, weil es nicht sinnvoll ist, dies zu tun. Stattdessen erhalten Sie eine NotImplementedException , weil eine Datei nicht, die Kinder haben die Möglichkeit ein Verzeichnis führt.
Beachten Sie, dass dies ist nicht beschränkt .NET - Sie stoßen werden diese Muster in vielen OO-Sprachen und Plattformen.
InformationsquelleAutor der Antwort
Warum Sie das Bedürfnis verspüren, fangen Sie jede mögliche Ausnahme? Sie wickeln jeden Methodenaufruf mit
catch (NullReferenceException ex)
auch?Stub-code werfen
NotImplementedException
ist ein Platzhalter, wenn Sie es zu release sollte es werden Fehler wieNullReferenceException
.InformationsquelleAutor der Antwort orip
Ich denke, es gibt viele Gründe, warum MS Hinzugefügt NotImplementedException zu dem Rahmen:
Frankodwyer denkt NotImplementedException als eine potenzielle Zeitbombe. Ich würde sagen, dass alle unfertigen code ist eine Zeitbombe, aber NotImplementedException ist viel einfacher zu Entwaffnen, als die alternativen. Zum Beispiel könnten Sie haben Ihr build-server Scannen Sie den Quellcode für alle Anwendungen dieser Klasse, und melden Sie als Warnungen. Wenn Sie wollen, um wirklich verbieten es, Sie konnte sogar noch ein pre-commit-hook auf Ihrer source-control-system, das verhindert, dass checkin code.
Sicher, dass, wenn Sie Rollen Sie Ihre eigenen NotImplementedException, können Sie es entfernen, aus dem letzten build, um sicherzustellen, dass keine Zeit Bomben übrig sind. Dies wird aber nur funktionieren, wenn Sie Ihre eigene Implementierung konsequent in das gesamte team, und Sie müssen sicherstellen, dass Sie nicht vergessen zu entfernen, bevor Sie Sie freigeben. Darüber hinaus werden Sie möglicherweise feststellen, dass Sie nicht entfernen können; vielleicht gibt es ein paar akzeptable verwendet, zum Beispiel in Test-code, der nicht an die Kunden ausgeliefert.
InformationsquelleAutor der Antwort oefe
Gibt es wirklich keinen Grund, um tatsächlich fangen eine NotImplementedException. Bei einem Treffer sollte es töten Ihre app, und zwar sehr schmerzhaft. Die einzige Möglichkeit, es zu beheben wird nicht durch fangen, aber ändern Sie Ihren source-code (entweder die Implementierung der aufgerufenen Methode, oder die änderung der aufrufende code).
InformationsquelleAutor der Antwort jeroenh
Zwei Gründen:
Methoden Stub sind während der Entwicklung, und die Ausnahmen zu erinnern, die Entwickler, die Ihren code zu schreiben, ist noch nicht abgeschlossen.
Implementierung einer Unterklasse, die Schnittstelle, die durch design, nicht implementieren eine oder mehrere Methoden der geerbten Basisklasse oder Schnittstelle. (Einige Schnittstellen sind einfach zu allgemein.)
InformationsquelleAutor der Antwort David R Tribble
Das klingt wie ein potenzielles Minenfeld für mich. In der Fernen Vergangenheit, ich arbeitete einmal auf einem legacy-Netzwerk-system, das ausgeführt worden ist nonstop für Jahren und fiel im Laufe eines Tages. Wenn wir verfolgt, das problem, wir haben einige code, der offensichtlich nicht abgeschlossen, und die noch nie gearbeitet haben - buchstäblich, wie der Programmierer, der bekam unterbrochen während der Programmierung. Es war offensichtlich, dass dieser bestimmte code-Pfad hatte nie vor.
Murphy ' s Gesetz sagt, dass etwas ähnliches ist nur betteln, um geschehen im Fall von NotImplementedException. Zugegeben, in diesen Tagen von TDD etc, sollte es abgeholt werden vor release, und man kann zumindest grep code für die Ausnahme vor release, aber immer noch.
Beim testen ist es schwierig, zu garantieren, Abdeckung von jedem Fall, und das klingt wie es macht Ihre Arbeit schwieriger, indem Sie ausführen Zeit Fragen, was gewesen sein könnte compile-Zeit Fragen. (Ich denke, eine ähnliche Art von "technischen Schulden" kommt mit Systemen, die sich stark auf 'duck typing', während ich bestätigen, Sie sind sehr nützlich).
InformationsquelleAutor der Antwort frankodwyer
Müssen Sie diese Ausnahme für COM-interop. Es ist E_NOTIMPL. Der verlinkte blog zeigt auch andere Gründe
InformationsquelleAutor der Antwort MSalters
Werfen
NotImplementedException
ist die logischste Weg für die IDE zu generieren, kompilieren stub-code. Wie bei der Erweiterung der Schnittstelle und erhalten Sie Visual Studio, um auszudrücken, das es für Sie.Wenn Sie sich ein bisschen C++/COM, die es gab dort auch, außer es war bekannt, wie
E_NOTIMPL
.Es ist eine gültige Fall für Sie. Wenn Sie auf eine bestimmte Methode einer Schnittstelle, die Sie möchten, dass code zu kompilieren, so können Sie Debuggen und testen. Nach deiner Logik müssten Sie entfernen die Methode aus dem interface und kommentiere nicht-stub-code zu kompilieren. Dies ist eine sehr fundamentalistische Ansatz und während es Verdienst, nicht jeder wird oder sollte sich. Neben, die meisten der Zeit, die Sie wollen, dass die Schnittstelle komplett ist.
Dass eine NotImplementedException schön erkennt, welche Methoden sind noch nicht bereit, am Ende des Tages ist es so einfach wie das drücken
Ctrl+Shift+F
um Sie alle zu finden, ich bin mir auch sicher, dass statische code-Analyse-tools wird es abholen zu können.Sie sind nicht gedacht, um Schiff-code, der
NotImplementedException
Ausnahme. Wenn Sie denken, dass Sie durch nicht verwenden, können Sie Ihr code besser, hinzugehen, aber es werden immer mehr produktive Dinge, die Sie tun können, zur Verbesserung der Quellcode-Qualität.InformationsquelleAutor der Antwort Igor Zevaka
NotImplementedException
Ausnahme wird ausgelöst, wenn eine angeforderte Methode oder Vorgang ist nicht implementiert.
Macht dies eine einzige Ausnahme definiert .NET core macht es leichter zu finden und Sie auszulöschen. Wenn jeder Entwickler sollte erstellen Sie Ihre eigenen
ACME.EmaNymton.NotImplementedException
wäre es schwerer, Sie zu finden alle.NotSupportedException
Ausnahme wird ausgelöst, wenn eine aufgerufene Methode nicht unterstützt wird.
Zum Beispiel, wenn es ist ein Versuch, zu Lesen, zu suchen, oder Sie schreiben auf einen stream, unterstützt nicht die aufgerufene Funktionalität.
Beispielsweise generierte Iteratoren (mit
yield
Schlüsselwort) ist einIEnumerator
aber dieIEnumerator.Reset
Methode wirftNotSupportedException
.InformationsquelleAutor der Antwort dalle
Von ECMA-335, CLI-Spezifikation, specificialy die CLI-Bibliothek-Typen, System.NotImplementedException, Abschnitt "Bemerkungen":
"Eine Reihe von Typen und Konstrukte angegeben, die an anderer Stelle in dieser Norm sind nicht erforderlich, der CLI-Implementierungen entsprechen, nur zu den Kernel-Profil. Zum Beispiel die floating-point-feature-set besteht aus dem floating-point-Datentypen System.Einzel-und System.Doppel. Wenn die Unterstützung für diese wird weggelassen, von einer Umsetzung ist jeder Versuch, eine Referenz-Signatur, die mit floating-point-Datentypen führt zu einer Ausnahme vom Typ System.NotImplementedException."
So, die Ausnahme ist vorgesehen für Implementierungen, die Umsetzung nur minimal conformance profile. Die minimal erforderliche Profil der Kernel-Profil (siehe ECMA-335, 4. Auflage - Partition IV, Abschnitt 3) enthält die BCL, die ist, warum die Ausnahme ist in der "core-API" und nicht an einem anderen Ort.
Mit der Ausnahme zu Kennzeichnen gekürzte Methoden, oder für designer generierter Methoden ohne Implementierung ist, missversteht die Absicht, die Ausnahme.
Ist, warum diese Informationen NICHT enthalten in der MSDN-Dokumentation für MS-Implementierung der CLI ist mir schleierhaft.
InformationsquelleAutor der Antwort
Ich kann nicht verbürgen für NotImplementedException (ich weitgehend einverstanden mit Ihrer Sicht), aber ich habe NotSupportedException ausgiebig in der core-Bibliothek, die wir bei der Arbeit verwenden. Die DatabaseController, zum Beispiel, können Sie eine Datenbank erstellen, die von beliebigen unterstützten Typs verwenden dann die DatabaseController Klasse während der rest Ihres Codes, ohne sich allzu sehr um die Art der Datenbank unter. Ziemlich grundlegendes Zeug, nicht wahr? Wo NotSupportedException kommt in handliches (und wo hätte ich meine eigene Implementierung, wenn man nicht bereits vorhanden ist) ist zwei hauptfällen:
1) die Migration einer Anwendung auf eine andere Datenbank
Es wird oft argumentiert, dies nur selten, wenn überhaupt, geschieht oder gebraucht wird. Bullsh*t ist. Mehr herausholen.
2) Gleiche Datenbank, verschiedene Treiber
Jüngstes Beispiel dafür war, als ein client, die nutzt eine Access-Anwendung unterstützt ein Upgrade von WinXP auf Win7 x64. Keine 64-bit-JET-Fahrer, die Ihre IT-Mann installiert die AccessDatabaseEngine statt. Wenn Sie unsere app abgestürzt, wir konnten einfach aus dem log sehen es war DB.Verbinden Absturz mit NotSupportedException - das waren wir schnell in der Lage, zu behandeln. Ein weiteres Aktuelles Beispiel war einer unserer Programmierer, versucht die Transaktionen auf eine Access-Datenbank. Selbst wenn Ihnen der Zugriff Transaktionen unterstützt, unsere Bibliothek nicht unterstützt Zugriff auf Transaktionen, die (aus Gründen, die außerhalb der Reichweite dieses Artikels). NotSupportedException, es ist Ihre Zeit zu glänzen!
3) Generische Funktionen
Ich kann nicht glauben, eine prägnante "aus der Praxis" - Beispiel hier, aber wenn Sie darüber nachdenken, so etwas wie eine Funktion, die fügt einen Anhang an eine E-Mail, die Sie wollen, dass es in der Lage sein zu nehmen, ein paar gemeinsame Dateien wie JPEGs, alles abgeleitet aus verschiedenen stream-Klassen, und fast alles hat ".ToString" - Methode. Für den letzten Teil, man kann sicherlich nicht jede mögliche Art, so dass Sie machen es zu generisch. Wenn ein Benutzer übergibt OurCrazyDataTypeForContainingProprietaryspreadsheetdata, reflektion verwenden, um test für das Vorhandensein von eine ToString-Methode und zurück NotSupportedException aus, um anzugeben, Mangel an Unterstützung für diese Datentypen nicht unterstützen ToString.
NotSupportedException nicht durch Mittel, die eine entscheidende Funktion, aber es ist etwas, ich finde mich viel mehr, wie ich die Arbeit an größeren Projekten.
InformationsquelleAutor der Antwort nathanchere
Können sagen, Sie haben diese Methode in Ihre Produktions-code
Welche würden Sie nehmen, wenn Sie verlassen wollen, um es später fertig zu sein?
oder
Ich würde sicherlich nehmen Sie die zweite. Gepaart mit Elmah oder was auch immer error logging-Mechanismus, die Sie haben (implementiert als ein Aspekt der gesamten Anwendung). Zusammen mit log/exception-Filterung Auslöser für bissige Fehler-E-Mail-Benachrichtigung, wenn man erwischt wird.
Dem argument, dass NotImplementedException == unfertige ist nicht korrekt. (1) den Fang von nicht-implementierte Methoden sollten überlassen werden, um unit-tests/Integrationstests. Wenn Sie 100% - Abdeckung (was sollten Sie jetzt tun, mit so vielen mock/stub/code generation tools) ohne NotImplementedException, was sind Ihre sorgen? (2) die Code-Generierung. Ganz einfach. Wieder, wenn ich den code erzeugen, der, und verwenden Sie nur die Hälfte des generierten Codes, warum hätte ich nicht NotImplementedException in den rest der generierte stub?
Es ist wie gesagt der code sollte nicht kompilieren, es sei denn, alle null-Werte zulässt Eingang sollte überprüft werden/werden für null. (AKA die Billionen-dollar-Fehler, wenn nicht noch mehr). Sprache sollte flexibel sein, während tests/Verträge sollten fest sein.
InformationsquelleAutor der Antwort Sleeper Smith
Selten ich nutze es für das interface reparieren. Angenommen, Sie haben eine Schnittstelle, die Sie erfüllen müssen aber bestimmte Methode wird nie aufgerufen, die von jedermann, also nur stick eine NotImplementedException und wenn jemand anruft, wird man Sie wissen, dass Sie etwas falsch machen.
InformationsquelleAutor der Antwort dr. evil
NotImplementedException geworfen wird, für einige Methode .NET (siehe parser C# im Code-DOM, die nicht implementiert ist, aber die Methode gibt !)
Sie können überprüfen Sie mit dieser Methode Microsoft.CSharp.CSharpCodeProvider.Analysieren
InformationsquelleAutor der Antwort Nicolas Dorier
Sind Sie beide hacks für zwei gemeinsame Probleme.
NotImplementedException ist ein workaround für Entwickler, die Architektur-Astronauten und gerne schreiben Sie die erste API, code später. Offensichtlich, denn dies ist nicht ein inkrementeller Prozess, Sie können nicht alle auf einmal umzusetzen, und deshalb wollen Sie so tun, Sie sind semi-getan durch das werfen NotImplementedException.
NotSupportedException ist ein hack, um die Beschränkung der Art von Systemen, wie Sie in C# und Java. In diese Systeme, Sie sagen, dass Sie ein Rechteck "ist ein" Form der iff Rechteck erbt alle Formen Merkmale (inkl. member-Funktionen + Variablen). Doch in der Praxis ist dies nicht wahr. Zum Beispiel, ein Quadrat ist ein Rechteck, sondern ein Quadrat ist eine Einschränkung auf ein Rechteck, nicht eine Verallgemeinerung.
Also, wenn Sie wollen, um zu Erben, und beschränken das Verhalten der übergeordneten Klasse, Sie werfen NotSupported auf Methoden, die keinen Sinn für die Einschränkung.
InformationsquelleAutor der Antwort
Was über Prototypen oder unfertige Projekte?
Ich glaube nicht, dass dies eine wirklich schlechte Idee, eine Ausnahme (obwohl ich eine messagebox, in diesem Fall).
InformationsquelleAutor der Antwort Toon Krijthe
Gut, ich eher Zustimmen. Wenn eine Schnittstelle wurde in einer solchen Weise, dass nicht alle Klassen implementieren können alle bits des es, es sollte haben wurde abgebaut, meine Meinung.
Wenn IList können oder können nicht geändert werden, es sollte haben wurde unterteilt in zwei, eine für die unveränderliche Teil (Getter, Suche, etc.), und eine für den modifizierbaren Teil (setter, hinzufügen, entfernen, etc.).
InformationsquelleAutor der Antwort Lasse Vågsæther Karlsen
Habe ich ein paar NotImplementedExceptions in meinem code. Oft kommt es aus dem Teil eine Schnittstelle oder eine abstrakte Klasse. Einige Methoden, die ich fühle, ich könnte in der Zukunft brauchen werden, machen Sie Sinn, als Teil der Klasse, aber ich einfach nicht die Zeit nehmen wollen, um hinzuzufügen, es sei denn, ich wirklich brauchen es. Ich habe zum Beispiel eine Schnittstelle für die einzelnen Arten von Statistiken in meinem Spiel. Eine dieser Arten sind ein ModStat, das ist die Summe der base-stat sowie alle Modifikatoren (also Waffen, Rüstung, Zaubersprüche). Meine stat-Schnittstelle hat eine onChanged-Ereignisse-Ereignis, aber mein ModStat funktioniert durch die Berechnung der Summe aller stats, auf den es verweist jedes mal, wenn es aufgerufen wird. Also anstatt den Aufwand für eine Tonne ModStat.OnChange-Ereignisse, die jedes mal ausgelöst, wenn ein stat-änderungen, ich habe nur eine NotImplementedException geworfen, wenn jemand versucht, das hinzufügen einer OnChange-listener.
.NET Sprachen sind alles über Produktivität, also warum verbringen Sie Ihre Zeit mit der Codierung etwas, das Sie nicht auch verwenden?
InformationsquelleAutor der Antwort Spodi
Hier ist ein Beispiel: In Java, wenn Sie das interface implementieren
Iterator
Sie überschreiben müssen, die offensichtliche MethodenhasNext()
undnext()
aber es gibt auchdelete()
. In 99% der usecases, die ich habe brauche ich nicht, also habe ich nur werfen eineNotImplementedException
. Das ist viel besser als schweigend nichts tun.InformationsquelleAutor der Antwort martinus
Die NotImplementedException existiert nur die Entwicklung vereinfachen. Stellen Sie sich vor Sie starten die Umsetzung einer Schnittstelle. Sie möchten in der Lage sein zumindest bauen, wenn Sie fertig sind, wird die Implementierung einer Methode, bevor Sie mit dem nächsten. Stubbing der NotImplemented Methoden mit NotImplementedExceptions ist eine großartige Art zu Leben, unfertige code, der ist super leicht zu finden später. Sonst würden Sie Gefahr laufen, schnell zu implementieren, etwas, dass Sie vielleicht vergessen zu beheben.
InformationsquelleAutor der Antwort
Wenn Sie nicht es verwenden möchten, dann ignorieren Sie es einfach. Wenn Sie einen code-block, dessen Erfolg hängt von jedem Stück, der es gelingt, aber es möglicherweise nicht dazwischen, dann ist Ihre einzige option ist, fangen die base
Exception
und roll zurück, was rückgängig gemacht werden soll. VergessenNotImplementedException
. Es könnten Tonnen von Ausnahmen, wieMyRandomException
undGtfoException
undOmgLolException
. Nachdem Sie ursprünglich den code schreiben könnte ich komm vorbei und werfen eine exception-Typ aus der API, die Sie aufrufen. Eine, die nicht existieren, wenn Sie schrieb deinen code. Behandeln Sie die, die Sie wissen, wie zu handhaben und rollback für alle anderen, d.h.,catch(Exception)
. Es ist ziemlich einfach, finde ich... ich finde es kommt auch praktisch. Vor allem, wenn Sie versuchen, ausgefallene Dinge mit der Sprache/framework, die gelegentlich zwingen, Dinge auf Sie.Ein Beispiel, das ich habe, ist die Serialisierung. Ich habe Eigenschaften in mir an .NET-Bibliothek, die nicht in der Datenbank vorhanden sind (zum Beispiel, bequeme Wrapper über vorhandene "dumme" Eigenschaften, wie ein
FullName
Eigenschaft, kombiniertFirstName
MiddleName
undLastName
). Dann möchte ich zu serialisieren, diese Datentypen auf XML senden Sie Sie über den Draht (z.B. von einem ASP.NET Anwendung von JavaScript), aber die Serialisierungs-framework nur serialisiert öffentliche Eigenschaften mit beidenget
undset
Accessoren. Ich will nicht, dass Sie in der Lage seinFullName
weil dann müsste ich parse es aus und es könnte einige unvorhergesehene format, dass ich falsch analysieren und die Integrität der Daten geht aus dem Fenster. Es ist einfacher, nur die zugrunde liegenden Eigenschaften, aber da die Sprache und der API erfordern, die michset
accessor, werfe ich einNotImplementedException
(ich war nicht bewusstNotSupportedException
bis ich diesen thread gelesen, aber entweder man arbeitet), so dass, wenn einige Programmierer, die Straße runter, nicht versuchenFullName
er begegnen Ausnahme beim testen und erkennen, seinen Fehler.InformationsquelleAutor der Antwort bambams