問題タブ [captured-variable]
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# に関する興味深い問題に遭遇しました。以下のようなコードがあります。
0、2、4、6、8 を出力するはずですが、実際には 10 が 5 個出力されます。
キャプチャされた 1 つの変数を参照するすべてのアクションが原因のようです。その結果、それらが呼び出されると、すべて同じ出力が得られます。
この制限を回避して、各アクション インスタンスに独自のキャプチャ変数を持たせる方法はありますか?
c# - キャプチャされた変数のインスタンス化の問題
私は現在、私が正しく理解できないいくつかのアイデアについて考えています。
問題は、1つのラムダ関数を使用してキャプチャされた変数をインスタンス化し、別のラムダを使用してその変数のプロパティにアクセスしたいということです。
インスタンス化はラムダ内で行われるため、変数は実際には2番目のラムダ内で使用したい時間にインスタンス化されません。これは一種の鶏が先か卵が先かという問題です。
変数は2番目のラムダで使用されるときにインスタンス化されることは知っていますが、コンパイラーはインスタンス化されません。
私のアイデアがうまくいく方法はありますか?実際のコードは次のとおりです。
c# - 変数を EventHandler に取り込む
私はこれを少し考えすぎているかもしれませんが、次のことを行う方法/最良の方法を特定するのにいくらかの助けを借りることができます.
別のクラスのプロパティであるオブジェクトにアタッチされたイベント ハンドラーがあります。私のイベント ハンドラーでは、イベントを引き起こしたオブジェクトに関する追加のメタデータ (つまり、イベントが含まれているオブジェクトの ID) が必要です。送信者とイベント情報から、必要な情報を取得する方法がありません。私の傾向は、これがキャプチャされた変数を使用するのに適した場所になるということでしたが、実装のアイデアがわかりません。
コードで説明するために、イベント ハンドラーがあります。
(注記として、ここではベース EventArgs を使用していますが、実際の実装では特殊なサブクラスであり、イベントはジェネリック EventHandler を使用して宣言されています)
私は現在、このようにそれを添付しています:
後で次のように切り離します。
イベントを処理するときに topObject の ID が必要なので、MyEventHandler を次の署名を持つように変更します。
次のようにイベント ハンドラーをアタッチします。
それに関する私の懸念は2つあります。
- これがアタッチされている関数の外に出ると、ハンドラーが削除されずに実際に消えるスコープに問題がありますか。過去に、ラムダ式を使用したときにイベント ハンドラーが消えてしまう奇妙なエラーを見たことがあります。常にではなく、場合によってはそうです。それらのケースが何であるかについて誰かが私に教えてくれるので、私が持っていた構文をいつ安全に使用できるかがわかります。
- 正確には思い出せませんが、作成される暗黙的なオブジェクトが同じではないため、この構文を使用した場合、イベント ハンドラーを削除することはできないと思います。
これら 2 つの懸念事項があるため、アクションを作成してアクションを保存し、イベント ハンドラーを削除する必要があるまでそれを使用することを考えました。私は次のことをしました:
アクションをイベント ハンドラーにキャストできないことがわかりました。イベント ハンドラーをデタッチできることを保証するこの変換を行う簡単な方法はありますか? 私はこれを考えすぎているだけですか/これを行うために今見ていない方法はありますか?
c# - 2つの正規表現グループをキー/値ペアオブジェクトに結合しますか?
次の文字列があるとしましょう
そして2つの正規表現グループ:キーと値
これらの2つのキャプチャされたグループをHashtableのようなキー/値ペアオブジェクトにどのように組み合わせることができますか?
c# - キャプチャされた変数を回避する方法は?
問題が発生しています
が実行されると、DoSomething
必要な値ではなく、キャプチャされた各変数の最新の値を受け取ります。私はこれに対する解決策を想像することができます、しかしそれはあなたたちがより良い解決策を思い付くことができると想像します
c# - IEnumerableのランクを計算する方法タイプTに保存します
IEnumerableリストの要素のランクを計算し、それをメンバーに割り当てたいと思います。ただし、以下のコードは、最初に呼び出された場合にのみ機能します。2回目の呼び出しは、最後のランク値から始まります。したがって、出力012と012の代わりに、012と345を取得しています。
r
2回目に呼び出されたときに、変数がキャプチャ(クロージャ)されて再利用されていることを理解しています。私はその振る舞いを望まない。ランクを計算して割り当てるためのクリーンな方法はありますか?またr
、変数(実際のコード内)は、foreach
ループが存在するのと同じスコープにありません。それは戻る関数にありますvar first
c# - キャプチャされた変数...その「キャプチャされた」は実際には何の略ですか?
「キャプチャされた変数」では、変数はどのようにキャプチャされますか?
その「キャプチャされた」という用語は実際には何を表していますか?
ボックスを使用せずに値型を参照することを意味しますか?
ありがとう
c# - ParameterizedThreadStart でキャプチャされた変数
10 個のスレッドを作成し、メッセージをコンソールに書き込む次のコードがあります。
私の理解ではParameterizedThreadStart
、参照のコピーがスレッドに送信されるオブジェクトを取得します。その場合、i
各ループ内でローカル コピーを作成していないため、すべての新しいスレッドが同じメモリ位置を指すことになり、特定のスレッド番号が「見逃される」可能性があります。ただし、これを実行すると (さらに多数のスレッド/スリープ時間に対しても)、 の各値にi
は独自のスレッドがあります。誰でも理由を説明できますか?
c# - ここでキャプチャされた変数の動作を確認できないのはなぜですか?
キャプチャされた変数でこの奇妙な動作に遭遇しました。以下は 2 つのループです。どちらも同じように振る舞うと思います。なぜ動作が異なるのですか?
最初のループは 1,2,3,4,5 を出力します 2 番目のループは 5,5,5,5,5 を出力します