問題タブ [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.

0 投票する
10 に答える
18599 参照

c# - ストップウォッチのタイミングをデリゲートまたはラムダでラップしますか?

私はこのようなコードを書いています、少し速くて汚いタイミングをしています:

確かに、このタイミングコードのビットを、(神は禁じられている)数回カットアンドペーストして、 ?に置き換えるのDoStuff(s)ではなく、派手な.NET3.0ラムダと呼ぶ方法があります。DoSomethingElse(s)

私はそれがとしてできることを知っていますがDelegate、私はラムダの方法について疑問に思っています。

0 投票する
8 に答える
3398 参照

c# - 順次メソッドを実行する最良の方法は何ですか?

メソッドのシーケンシャル セットを毎秒実行する必要があるプロジェクトに取り組んでいますx。現在、別の「親メソッド」にメソッドが含まれており、それらを次々と順番に呼び出しています。

次のステップを実行する前に、各メソッドは例外をスローすることなく正常に実行される必要があります。whileそのため、これらの各メソッドをandでラップし、try..catchそのcatchメソッドを再度実行します。

これは臭いがあり、あまり乾燥していないようです。これを行うためのより良い方法があるので、新しい機能を同じメソッドにラップしていません。これを実装する適切な方法は、ある種のデリゲート コレクションではありませんか?

もっと「適切な」解決策はありますか?

0 投票する
6 に答える
68259 参照

c# - リスト内の何かを Find() するための適切な述語デリゲートを作成するにはどうすればよいですか?

MSDN を見た後、T のメンバー変数を使用して List で Find() メソッドを使用するための適切な述語をどのように形成する必要があるかはまだ不明です (T はクラスです)。

例えば:

「byYear」述語はどのように見えるべきですか?

(MSDN の例では、恐竜のリストについてのみ説明し、不変の値「saurus」のみを検索します。値を述語に渡す方法は示していません...)

編集: 私は VS2005/.NET2.0 を使用しているため、ラムダ表記は利用できないと思います...

EDIT2:異なる値に基づいてプログラムで「検索」したい場合があるため、例の「1999」を削除しました。for-do ループを使用して、例を 1980 年から 2000 年までの自動車の範囲に変更しました。

0 投票する
5 に答える
23433 参照

c# - C# のデリゲート配列

デリゲート配列からデリゲート関数を呼び出す実験をしています。デリゲートの配列を作成できましたが、デリゲートを呼び出すにはどうすればよいですか?

編集: 配列の理由は、必要に応じてインデックスでデリゲート関数を呼び出す必要があるためです。イベントに応答して実行されるわけではありません。配列 (デリゲート) の名前ではなく pd[] 型を使用してデリゲート関数を実行しようとしたため、コードに重大な (ばかげた) エラーが表示されます。

0 投票する
3 に答える
21396 参照

c# - マルチスレッドアプリケーションで安全にデータを取り込み、DataGridView を Refresh() するにはどうすればよいですか?

私のアプリには、DataGridView オブジェクトと MousePos タイプの List があります。MousePos は、マウスの X、Y 座標 ("Point" 型) とこの位置の現在のカウントを保持するカスタム クラスです。毎秒 1 回イベントを発生させ、マウス位置をチェックし、このリストのマウス位置のカウントを追加および/または更新するスレッド (System.Timers.Timer) があります。

ユーザーがデータを表示できるように、DataGridView を自動的に Refresh() するために 1 秒に 1 回イベントを再び発生させる、同様の実行中のスレッドが必要です (これも System.Timers.Timer が適切な選択だと思います)。画面更新。(TaskManager のように。)

残念ながら、DataGridView.Refresh() メソッドを呼び出すと、VS2005 が実行を停止し、クロススレッドの状況に陥ったことが通知されます。

私が正しく理解していれば、現在3つのスレッドがあります:

  • プライマリ UI スレッド
  • MousePos リスト スレッド (タイマー)
  • DataGridView 更新スレッド (タイマー)

プライマリ スレッドで DataGridView を Refresh() できるかどうかを確認するために、DataGridView.Refresh() を呼び出すボタンをフォームに追加しましたが、これは (奇妙なことに) 何もしませんでした。DataGridView.DataSource = null を設定してリストに戻すと、データグリッドが更新されることを示すトピックを見つけました。実際、これは機能しましたが、ボタンを介してのみ (プライマリ スレッドで処理されます)。


したがって、この質問は 2 つの部分に変わりました。

  1. DataGridView.DataSource を null に設定してリストに戻すことは、データグリッドを更新するための受け入れ可能な方法ですか? (私には効率が悪いように思えます...)
  2. マルチスレッド環境でこれを安全に行うにはどうすればよいですか?

これまでに書いたコードは次のとおりです(C#/ .Net 2.0)

0 投票する
4 に答える
220 参照

c# - 同じ方法で処理する必要がある複数のメソッド

現在書いている C# の一部では、同じシグネチャを持つ複数のメソッドを同じ方法で処理する必要があります。また、将来的にはこれらの方法がさらに増える可能性があります。同じ種類のロジックを何度も繰り返す代わりに、次のことを考えました。

これにはいくつかの優れた機能があると思いますが、少し設計しすぎて難読化されているようにも感じます。

これを行うためのより良い方法に感謝できますか?

ところで:

  • トランザクションである必要はありません。
  • strFailure は例外を非表示にせず、必要に応じて完全にラップします

ありがとう。

0 投票する
5 に答える
500 参照

c# - ウィンドウ間の相互作用

C#アプリで複数のウィンドウ間をやり取りする最良/適切な方法は何ですか? 最近、プログラム ウィンドウの 1 つがメイン ウィンドウを変更するメソッドを呼び出さなければならないという問題に遭遇しました。私の解決策は、基礎となるすべてのモデルデータを整理し、さまざまなウィンドウ間の通信を (デリゲートを介して) 整理する、ファクトリのようなクラスを作成することでした。しかし、1 つまたは 2 つのデリゲートを渡すことは問題ではなかったので、他のウィンドウがメイン ウィンドウと適切に対話するために 10 のデリゲートを必要とする場合はどうすればよいか考え始めました。デリゲートは良い解決策ですか? それらを適切な方法で渡す方法-コンストラクター、プロパティを介して? それとも、それほど多くのデリゲートを使用する必要があること自体が、重大な設計上の欠陥なのでしょうか?

0 投票する
4 に答える
13880 参照

c# - DLL からの C# コールバック

アプリケーション A と DLL B を両方とも C#.NET で作成しています。次のことを行うにはどうすればよいですか。

  1. A は B の関数を呼び出します
  2. B にデリゲート/コールバックを使用して A の UI のステータスを更新してもらいたい

これはBackgroundWorker に関するものではありません...その部分は A で正常に動作します。私が見ることができないのは、A で呼び出す関数を B に知らせる方法です。

0 投票する
5 に答える
26126 参照

.net - デリゲートとコールバックは同じですか、それとも似ていますか?

デリゲートはコールバックと同じものですか? それとも何らかの関係がありますか?

0 投票する
2 に答える
57163 参照

c# - イベント ハンドラーを正しく登録解除する方法

コード レビューで、イベント ハンドラーの登録を解除するために、この (簡略化された) コード フラグメントに出くわしました。

これまでに登録されたことのない新しいデリゲートが作成されるため、これはイベント ハンドラーの登録を解除しないと考えました。しかし、MSDN を検索すると、このイディオムを使用するコード サンプルがいくつか見つかりました。

だから私は実験を始めました:

驚いたことに、次のことが起こりました。

  1. Fire("Hello 1");予想どおり、2 つのメッセージが生成されました。
  2. Fire("Hello 2");1つのメッセージを作成しました!これにより、デリゲートの
    登録解除が機能することが確信できました。new
  3. Fire("Hello 3");を投げたNullReferenceException
    コードをデバッグすると、イベントの登録を解除した後であることFireが示されました。null

イベント ハンドラーとデリゲートについては、コンパイラが舞台裏で多くのコードを生成することを知っています。しかし、なぜ私の推論が間違っているのか、まだ理解できません。

私は何が欠けていますか?

Fire追加の質問: イベントが登録されていないという事実から、nullイベントが発生するすべての場所でチェックnullが必要であると結論付けます。