[解決済み] InvokeとDynamicInvokeの違いについて
2022-05-02 03:48:32
質問
デリゲートにおけるInvokeとDynamicInvokeの違いは何ですか?その2つのメソッドの違いを説明するコード例を教えてください。
どのように解決するのですか?
デリゲートインスタンスがあるとき、正確な型を知っているかもしれませんし、あるいは、それが
Delegate
. 正確な型がわかっている場合は
Invoke
であり、これは
非常に速い
- は、すべて事前に検証されています。例えば
Func<int,int> twice = x => x * 2;
int i = 3;
int j = twice.Invoke(i);
// or just:
int j = twice(i);
しかし! ということだけを知っていれば
Delegate
そのため、パラメータなどを手動で解決する必要があり、アンボックスなどが必要になる場合があります。例えば
Delegate slowTwice = twice; // this is still the same delegate instance
object[] args = { i };
object result = slowTwice.DynamicInvoke(args);
なお、私は
args
を明確にするために、長い手で
object[]
が含まれます。ここには余分なコストがたくさんかかっています。
- 配列
-
渡された引数が実際の動作に合っているかどうかを確認する
MethodInfo
- 必要に応じてアンボックスなど
- リフレクションインボーク
- の場合、呼び出し側は戻り値を処理するために何かをする必要があります。
基本的には
DynamicInvoke
を使用することができます。
Invoke
のみがある場合を除き、常に優先されます。
Delegate
と
object[]
.
性能比較のため、デバッガ以外(コンソールexe)のリリースモードでは、次のように表示されます。
Invoke: 19ms
DynamicInvoke: 3813ms
コード
Func<int,int> twice = x => x * 2;
const int LOOP = 5000000; // 5M
var watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.Invoke(3);
}
watch.Stop();
Console.WriteLine("Invoke: {0}ms", watch.ElapsedMilliseconds);
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.DynamicInvoke(3);
}
watch.Stop();
Console.WriteLine("DynamicInvoke: {0}ms", watch.ElapsedMilliseconds);
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] AddTransient、AddScoped、AddSingleton サービスの相違点
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] 2つの日付の差(日数)を計算する?
-
[解決済み] SelectとSelectManyの違い
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み】Invoke()とBeginInvoke()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] 関数を終了するには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] Stringを同等のLINQ Expression Treeに変換する方法は?