2017-09-18 2 views
0

Ich habe ein Array von Button-Objekten, denen ich eine Funktion mit verschiedenen Argumenten übergeben möchte. Diese Funktion benötigt ein int-Argument. Ich habe versucht, die folgenden:Übergabe von Werten an Delegaten

public void ButtonClick(int i){ 
    //do things with value of i 
} 

public void FillButtonClicks(){ 
    for(int i = 0; i < 3; i++){ 
    ButtonArray[i].AddListener(delegate{ButtonClick(i);}); 
    } 
} 

Diese „Werke“, dass die Tasten, um die entsprechenden Delegierten erhalten, aber es funktioniert nicht, dass der Garbage Collector auf den Wert hält der ‚i‘ in der for-Schleife Wenn Sie also auf eine der drei Schaltflächen klicken, wird ButtonClick (3) ausgeführt. Gibt es eine Möglichkeit, die Weitergabe von Werten zu erzwingen, oder muss ich nur noch etwas tun stumm wie:

ButtonArray[0].AddListener(delegate{ButtonClick(0);});  
ButtonArray[1].AddListener(delegate{ButtonClick(1);});  
ButtonArray[2].AddListener(delegate{ButtonClick(2);}); 
+0

Haben Sie die Verwendung von Button.CommandName oder Button.CommandArgument untersucht, statt den Wert direkt an die Funktion zu übergeben? –

+0

Nicht sicher, was Sie mit diesen Vorschlägen meinen. Fruchtzwergs Antwort löste das Problem jedoch. –

+0

Abhängig von der von Ihnen verwendeten API verfügt die Button-Klasse häufig über öffentliche Parameter, mit denen Sie entweder einen String (Button.CommandName) oder einen Objektwert (Button.CommandArgument) speichern können, auf den die Schaltflächenklick-Handler zugreifen können. –

Antwort

0

Sie benötigen eine lokale Kopie von i innerhalb der Schleife zu machen.

public void FillButtonClicks(){ 
    for(int i = 0; i < 3; i++){ 
    int j = i; 
    ButtonArray[j].AddListener(delegate{ButtonClick(j);}); 
    } 

Grund: ButtonClick aufgerufen wird, nachdem bereits die Schleife durch iteriert und der Parameter ist der aktuelle Wert des i (nach allen Iterationen der letzte Index). Dieses Verhalten ist ein wenig verwirrend, aber völlig korrekt, wie von Eric Lippert bei Closing over the loop variable considered harmful beschrieben.

Verwandte Themen