ランタイム値を含むデリゲートでイベントを初期化するにはどうすればよいですか?

NikosD

一連のデリゲートアクションを使用して一連のイベントを割り当てようとしたときに、この問題が発生しました。この関数を使用するとAssignEventsManually()、イベントによって、割り当てられたデリゲートが、含まれている情報(異なる番号)で正しくトリガーされます。ループを使用してこれらの割り当てを行うと、すべてのボタンが同じ値「B2」を出力します。

デリゲート自体はヒープに格納されているようですが、反復番号iはスタックにあり、各デリゲートは同じアイテムを参照しています。各デリゲートにイテレータの独自のインスタンスを割り当てるにはどうすればよいですか?

using System.Windows.Forms;

namespace DelegatesTest
{
    public partial class Form1 : Form
    {
        Button[] bar;                

        public Form1()
        {
            InitializeComponent();

            bar = new Button[] { button1, button2, button3 };

            for (int i=0; i<3; i++)
            {                                
                bar[i].Click += delegate
                {                    
                    richTextBox1.Text = $"B{i}";
                };                               
            }

            //AssignEventsManually();
        }

        void AssignEventsManually()
        {            
            button1.Click += delegate
            {
                richTextBox1.Text = $"b{1}";
            };            
            button2.Click += delegate
            {                
                richTextBox1.Text = $"b{2}";
            };            
            button3.Click += delegate
            {                
                richTextBox1.Text = $"b{3}";
            };            
        }

    }
}
マーク・グラヴェル

デリゲート自体はヒープに格納されているようですが、反復番号「i」がスタックにあり、各デリゲートは同じアイテムを参照しています。各デリゲートにイテレータの独自のインスタンスを割り当てるにはどうすればよいですか?

iこれは、コンテキストクラスのヒープ上にある「キャプチャされた」変数です。コンテキストクラスのスコープは、と同じiです。つまり、ループの期間中です。

これを修正するには:ループi スナップショットコピーを作成します。

for (int i=0; i<3; i++)
{
    int cpy = i;
    bar[i].Click += delegate
    {                    
        richTextBox1.Text = $"B{cpy}";
    };   
}

またはおそらくより効率的に:

for (int i=0; i<3; i++)
{
    string txt = $"B{i}";
    bar[i].Click += delegate
    {                    
        richTextBox1.Text = txt;
    };
}

余分なローカルの範囲があるので、これは動作します内側ループので、:ループの繰り返しごとに異なる捕捉コンテキストを。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

別のクラスのインスタンスを含むリストを初期化するにはどうすればよいですか?

分類Dev

エントリ/値を含むLinkedListを初期化するにはどうすればよいですか?

分類Dev

初期化リストを使用しているときにプライベートデータを取得するにはどうすればよいですか?

分類Dev

Netlogo:特定の条件でデクリメントタイマーの「初期値」をインストールするにはどうすればよいですか

分類Dev

列の値とカウントのリストを含むデータフレームを分割するにはどうすればよいですか?

分類Dev

csvデータを含むRDDで空の値を含むエントリを削除するにはどうすればよいですか?

分類Dev

C#でイベントデリゲートからの戻り値を処理するにはどうすればよいですか?

分類Dev

VBデリゲートをPythonイベントハンドラーに変換するにはどうすればよいですか?

分類Dev

サーバーをラップトップとして無料で使用し、httpsリンクを含むデータベースを使用してWebサイトをホストするにはどうすればよいですか?

分類Dev

特定のテキストを含むクラスのデータインデックスを取得するにはどうすればよいですか?

分類Dev

デフォルトのタイムゾーンを含むisoformat日時文字列を取得するにはどうすればよいですか?

分類Dev

C#:プライベート内部クラスのリストをインスタンス化するにはどうすればよいですか?

分類Dev

インデックスのリストを含むnumpy配列のリストから値を取得するにはどうすればよいですか?

分類Dev

テキスト、絵文字アイコン、リンクを含むラベルをTkinterで作成するにはどうすればよいですか?

分類Dev

アプリアイコンを含むカスタムデザインのQRコードを生成するにはどうすればよいですか?

分類Dev

タイムスタンプリストの要素がタイムスタンプを含むシリーズに含まれているかどうかを確認するにはどうすればよいですか?

分類Dev

ドキュメントにC#イベントハンドラーデリゲートを含めるようにdocfxを構成するにはどうすればよいですか?

分類Dev

サイズが約300000の約300000個のベクトルを含むベクトルを初期化するにはどうすればよいですか?

分類Dev

サイズが約300000の約300000個のベクトルを含むベクトルを初期化するにはどうすればよいですか?

分類Dev

jquery mobileでリリースタップイベントのスライダー値を取得するにはどうすればよいですか?

分類Dev

Akkaストリームの値を使用してGooglePubSubフローをインスタンス化するにはどうすればよいですか?

分類Dev

Blazorでカスタム値変更イベントハンドラーを作成するにはどうすればよいですか?

分類Dev

クエリを使用してデータをインポートし、行の値でグループ化するにはどうすればよいですか?

分類Dev

イベントをトリガーせずにFirebaseデータベースからデータを取得するにはどうすればよいですか?

分類Dev

Firebase値イベントでリスナーを設定するにはどうすればよいですか?

分類Dev

ディープリンク用のタブとナビゲーションコントローラーを使用してビューコントローラーをインスタンス化するにはどうすればよいですか?

分類Dev

配列を含む各パンダデータフレームセルにPythonリストを追加するにはどうすればよいですか?

分類Dev

クラスメンバーであるスマートポインタを初期化するにはどうすればよいですか?

分類Dev

コントローラから引き出されたアイテムで怠惰なUISegmentedControlを初期化するにはどうすればよいですか?

Related 関連記事

  1. 1

    別のクラスのインスタンスを含むリストを初期化するにはどうすればよいですか?

  2. 2

    エントリ/値を含むLinkedListを初期化するにはどうすればよいですか?

  3. 3

    初期化リストを使用しているときにプライベートデータを取得するにはどうすればよいですか?

  4. 4

    Netlogo:特定の条件でデクリメントタイマーの「初期値」をインストールするにはどうすればよいですか

  5. 5

    列の値とカウントのリストを含むデータフレームを分割するにはどうすればよいですか?

  6. 6

    csvデータを含むRDDで空の値を含むエントリを削除するにはどうすればよいですか?

  7. 7

    C#でイベントデリゲートからの戻り値を処理するにはどうすればよいですか?

  8. 8

    VBデリゲートをPythonイベントハンドラーに変換するにはどうすればよいですか?

  9. 9

    サーバーをラップトップとして無料で使用し、httpsリンクを含むデータベースを使用してWebサイトをホストするにはどうすればよいですか?

  10. 10

    特定のテキストを含むクラスのデータインデックスを取得するにはどうすればよいですか?

  11. 11

    デフォルトのタイムゾーンを含むisoformat日時文字列を取得するにはどうすればよいですか?

  12. 12

    C#:プライベート内部クラスのリストをインスタンス化するにはどうすればよいですか?

  13. 13

    インデックスのリストを含むnumpy配列のリストから値を取得するにはどうすればよいですか?

  14. 14

    テキスト、絵文字アイコン、リンクを含むラベルをTkinterで作成するにはどうすればよいですか?

  15. 15

    アプリアイコンを含むカスタムデザインのQRコードを生成するにはどうすればよいですか?

  16. 16

    タイムスタンプリストの要素がタイムスタンプを含むシリーズに含まれているかどうかを確認するにはどうすればよいですか?

  17. 17

    ドキュメントにC#イベントハンドラーデリゲートを含めるようにdocfxを構成するにはどうすればよいですか?

  18. 18

    サイズが約300000の約300000個のベクトルを含むベクトルを初期化するにはどうすればよいですか?

  19. 19

    サイズが約300000の約300000個のベクトルを含むベクトルを初期化するにはどうすればよいですか?

  20. 20

    jquery mobileでリリースタップイベントのスライダー値を取得するにはどうすればよいですか?

  21. 21

    Akkaストリームの値を使用してGooglePubSubフローをインスタンス化するにはどうすればよいですか?

  22. 22

    Blazorでカスタム値変更イベントハンドラーを作成するにはどうすればよいですか?

  23. 23

    クエリを使用してデータをインポートし、行の値でグループ化するにはどうすればよいですか?

  24. 24

    イベントをトリガーせずにFirebaseデータベースからデータを取得するにはどうすればよいですか?

  25. 25

    Firebase値イベントでリスナーを設定するにはどうすればよいですか?

  26. 26

    ディープリンク用のタブとナビゲーションコントローラーを使用してビューコントローラーをインスタンス化するにはどうすればよいですか?

  27. 27

    配列を含む各パンダデータフレームセルにPythonリストを追加するにはどうすればよいですか?

  28. 28

    クラスメンバーであるスマートポインタを初期化するにはどうすればよいですか?

  29. 29

    コントローラから引き出されたアイテムで怠惰なUISegmentedControlを初期化するにはどうすればよいですか?

ホットタグ

アーカイブ