問題タブ [delegates]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# でデリゲートを使用するのはいつですか?
C# でデリゲートをどのように使用していますか?
c# - C# ジェネリックではデリゲート型の制約が許可されない
次のようにC#でクラスを定義することは可能ですか?
私は一生、.NET 3.5 で昨夜これを達成することはできませんでした。使ってみた
delegate, Delegate, Action<T> and Func<T, T>
これはある意味許されるべきだと思います。独自の EventQueue を実装しようとしています。
私はこれをやっただけです[原始的な近似はあなたに気をつけてください]。
しかし、その後、異なるタイプの関数に対して同じ定義を再利用することができなくなります。
考え?
asp.net - ASP.NET マスター ページを使用したイベントとデリゲート
マスター ページによって発生したカスタム イベントをキャッチするにはどうすればよいですか?
私のマスター ページには、カスタム イベントとデリゲートがあります。
これは、マスター ページのリンク ボタンがクリックされたときに発生します。
ページのユーザー コントロールで、そのイベントをサブスクライブしたいのですが、どのようにアクセスすればよいかわかりません。通常、私は次のようなことをします:
しかし、マスター ページを扱うということは、これが不可能であることを意味します。
c# - MS Excel および COM によってホストされる C# 2 のデリゲート内の例外の動作
みなさん、おはよう、
ここで少し言語理論の質問があります... C# の例外処理とデリゲートが場合によっては異なる動作をすることを示唆する参考文献をオンラインで見つけましたが、この問題に関する具体的なドキュメントは見つかりません。
最近、Microsoft Excel アドインのデリゲート内で例外が発生し、MSVC ランタイムでハード クラッシュが発生するという大きな問題が発生しました。デリゲートを削除することでこれは解決しましたが、私は今、悲惨な詳細を知りたいと思っています.
コアコードの簡潔な例として:
上記の構成により、集中型のエラー処理が可能になり、純粋なコードの観点からは、クリーンで簡潔になりました。公開されている各関数はデリゲートとして宣言され、上記のフラグメントを介して実行されます。
単純なコンソール アプリでは、デリゲートから例外をスローするか、単純な予期しないエラー (たとえば、null ポインターで ToString() を "誤って" 呼び出す) をスローすると、期待どおりに機能し、エラーは必要に応じて処理されます。
MS Excel を投入すると、ハード クラッシュが発生します。コードをステップ実行すると、エラーが発生した場所が示されますが、すべてが破壊の大きな火の玉になる前に、スタックの巻き戻しが行われていないように見えます。
私の仮説は、.NET ランタイム (つまり、コード) をホストしている COM が、通常の .NET コードの実行とは異なることを行っているというものです。これによりエンドポイントが強制終了され、Excel はこれを認識せず、COM を介してエンドポイントにアクセスしようとしますが、エンドポイントが何らかの形で消失したことを確認し、Excel が代わりにクラップアウトします。
これは、Excel + COM + デリゲートの組み合わせでのみ発生しますが、この動作でどちらがより影響力があるかは正直わかりません... 何か考えはありますか?
c# - デリゲート結果のキャッシュ
Predicate<Foo> を受け入れ、一致する項目のリストを返す C# メソッドがあります...
フィルタは、多くの場合、一般的なセットの 1 つになります...
...しかし、匿名の代理人である可能性があります。
このメソッドで結果を ASP.NET キャッシュにキャッシュするようにしたいので、同じデリゲートを繰り返し呼び出すと、キャッシュされた結果が返されます。このために、デリゲートからキャッシュ キーを作成する必要があります。Delegate.GetHashCode() は、この目的のために適切な結果を生成しますか? 私が見るべきデリゲートの他のメンバーはいますか? これをまったく別の方法で行いますか?
c# - C# イベントは舞台裏でどのように機能しますか?
C#、.NET 3.5 を使用しています。イベントの利用方法、クラスでのイベントの宣言方法、別の場所からイベントをフックする方法などを理解しています。不自然な例:
ただし、私が理解していないのは、イベントハンドラーを宣言するときです
初期化されることはありません。つまり、ElementAddedEvent とは正確には何なのでしょうか? それは何を指していますか?EventHandler が初期化されないため、以下は機能しません。
EventHandler.CreateDelegate(...) があることに気付きましたが、すべてのメソッド シグネチャは、これが典型的な ElementAddedEvent += new EventHandler(MyMethod) を通じて既存の EventHandler にデリゲートをアタッチするためにのみ使用されることを示唆しています。
私がやろうとしていることが役立つかどうかはわかりません...しかし、最終的には、LINQで抽象的な親DataContextを考え出し、その子が「監視」したいテーブルタイプを登録できるようにして、イベントを作成できるようにしたいと思いますBeforeUpdate や AfterUpdate などですが、タイプに固有です。このようなもの:
これについて考えると、イベントのフードの下で何が起こっているのか本当に理解していないことに気づきました-そして理解したいと思います:)
c# - C# でイベント ハンドラーをアタッチする 2 つの異なる方法に実際の違いはありますか?
C#では、フードの下に(構文以外の)実際の違いがあります:
と
?
c# - C#:仮想関数の呼び出しはデリゲートの呼び出しよりもさらに高速ですか?
たまたま、コード設計に関する1つの質問があります。たとえば、「変更」する可能性のあるいくつかの関数を呼び出す「テンプレート」メソッドが1つあります。直感的なデザインは、「テンプレートデザインパターン」に従うことです。変更関数を、サブクラスでオーバーライドされる「仮想」関数として定義します。または、「仮想」なしでデリゲート関数を使用することもできます。デリゲート関数は、カスタマイズできるように挿入されています。
もともと、2番目の「デリゲート」方法は「仮想」方法よりも高速だと思っていましたが、一部のコーディングスニペットはそれが正しくないことを証明しています。
以下のコードでは、最初のDoSomethingメソッドは「テンプレートパターン」に従います。仮想メソッドIsTokenCharを呼び出します。2番目のDoSomthingメソッドは、仮想関数に依存しません。代わりに、パスインデリゲートがあります。私のコンピューターでは、最初のDoSomthingは常に2番目のDoSomthingよりも高速です。結果は1645:1780のようになります。
「仮想呼び出し」は動的バインディングであり、直接委任呼び出しよりも時間のかかる作業ですよね?しかし、結果はそうではないことを示しています。
誰でもこれを説明できますか?
c# - イベントが .NET でデリゲートとして実装されている場合、.event IL セクションのポイントは何ですか?
デリゲート、イベント、およびこれら 2 つの機能の .NET 実装に関するスタック オーバーフローに関する非常に良い質問をいくつか見てきました。特に、「C# イベントは舞台裏でどのように機能しますか?」という 1 つの質問は、いくつかの微妙な点を非常によく説明する優れた回答を生み出しました。
上記の質問に対する答えは、次の点を指摘しています。
フィールドのようなイベントを宣言すると、コンパイラはメソッドとプライベート フィールド (デリゲートと同じ型) を生成します。クラス内で ElementAddedEvent を参照するときは、フィールドを参照しています。クラスの外では、フィールドを参照しています
同じ質問 (「フィールドのようなイベント」)からリンクされた MSDN の記事には、次のものが追加されています。
イベントを発生させるという概念は、イベントによって表されるデリゲートを呼び出すこととまったく同じです。したがって、イベントを発生させるための特別な言語構造はありません。
さらに詳しく調べたいので、イベントとデリゲートがコンパイルされる IL を表示するために、テスト プロジェクトを作成しました。
デリゲート フィールドhandler
とイベントFooEvent
はほぼ同じ IL コードにコンパイルされ、コンパイラによって生成されたFooEvent
フィールドへのアクセスをラップするメソッドがいくつか追加されることを期待していました。しかし、生成された IL は、私が期待したものとはまったく異なりました。
add
イベントは、コンパイラによって生成されたおよびメソッドを持つデリゲートにすぎないためremove
、IL でイベントがそれ以上のものとして扱われるとは思っていませんでした。ただし、 add メソッドと remove メソッドは、通常のメソッドとは 異なり.event
、で始まるセクションで定義されています。.method
.event
私の最終的な質問は次のとおりです。イベントがアクセサー メソッドを持つデリゲートとして単純に実装されている場合、 IL セクションを持つ意味は何ですか? .method
セクションを使用して、これなしで IL に実装できませんでしたか? と.event
同等.method
ですか?
delegates - デリゲートを介してオーバーライド可能なメソッドを実行すると、Invoke()とBeginInvoke()の動作が異なります
このコードがなぜそのように動作するのか誰かに教えてもらえますか?コードに埋め込まれたコメントを参照してください...
私はここで本当に明白な何かを逃していますか?