3

クラス「a」から継承するクラス「b」があります。クラス 'a' には、イベントが null でない場合にアクションを実行するコードがあります。アプリケーションの特定の時間にクラス「b」でそのコードを起動する必要があります。したがって、「b」では、新しい Handler(event) をサブスクライブしました。

自動生成されたイベントを「そのまま」クラス「b」にそのままにしておくとthrow new NotImplementedException();、コードは期待どおりに機能/実行されます。Thow 例外を削除するとすぐに、アプリケーションは期待どおりに動作しなくなります。

throw new NotImplementedExceptionでは、例外をスローする以外 に何をしているのでしょうか?

この時点で、おそらくコーディングの問題を間違った方法で解決しようとしていることに気づきました。それを行うためのより良い方法が見つかると確信しています (私はまだ学習中です)が、私の質問は残っています. その行がコードの結果を変えるのはなぜですか?

編集:私は自分のコードをあまり具体的に説明したくないことに気づきました。残念ながら、厳しいポリシーのため、私はそうすることができません. クラス「a」にifステートメントがあります。

if (someEvent != null)

コードが「機能する」場合、if ステートメントは true を返します。期待どおりに動作しない場合、「false」が返されます。クラス「b」では、アプリケーションが「機能する」(または if ステートメントが true を返す) のはthrow new NotImplementedException();、新しいイベントを追加したときに自動生成されるクラス「b のイベント メソッド」に行があるときだけです。

4

5 に答える 5

6

これについて考えてみてください: 次の方法で 2 つの整数を加算したい場合はどうなるでしょうか...

private int Add(int x, int y)
{

}

...そして、そのようなことを行うためのコードが内部にありません(メソッドは整数を返しません)。これがNotImplementedException使用されるものです。

于 2012-04-17T14:37:22.297 に答える
2

アプリケーションが「機能する」ことを意味する理由は、例外を処理するコードに完全に依存しているため、単なる例外です。

通常の例外とは対照的に、これは「特別な」例外ではありません (Exception残りのよ​​うなものから派生することを除いて)。内部でスローされるメンバーを実装するためのプレースホルダーとして、コード生成でそれを見る傾向があります。コンパイル コードを出力するために、コード生成でメンバー構造を理解しようとするよりも、これを行う方がはるかに簡単です。

「期待どおりに動作しなくなった」と言うときは、コンパイルされると想定しています。これを削除すると、コードのコンパイルが停止し、戻り値に関するコンパイル エラーが発生する可能性が高くなります。

おそらく、イベントをトリガーするコードはハンドラーからの特定の応答を期待するか、ハンドラーまたは例外が発生しない場合は、応答をデフォルトにして続行します。あなたの場合、ハンドラーがあり、例外がないので、より良い応答が期待されますか?

完全な推測。

aで使用する必要があるコードが にある場合は、bそのコードを格納するメソッドを作成することを検討してください。動作が必要な場合はprotectedオプションです。virtualoverride

于 2012-04-17T14:35:04.467 に答える
1

The NotImplementedException is a way of declaring that a particular method of an interface or base class is simply not implemented in your type. This is the exception form of the E_NOTIMPL error code.

In general an implementation shouldn't be throwing a NotImplementedException unless it's a specifically supported scenario for that particular interface. In the vast majority of scenarios this is not the case and types should fully implement interfaces.

In terms of what it's doing though. It's simply throwing an exception. It's hard to say why the program keeps function in the face of the exception and breaks without it unless you give us a bit more information.

于 2012-04-17T14:38:14.877 に答える