web-dev-qa-db-fra.com

C # référençant une variable d'une autre méthode

Je suis nouveau sur C # et j’ai vraiment besoin de savoir comment appeler/utiliser une chaîne depuis une autre méthode.

Par exemple:

public void button1_Click(object sender, EventArgs e)
{ 
    string a = "help";
}

public void button2_Click(object sender, EventArgs e)
{
    //this is where I need to call the string "a" value from button1_click 
    string b = "I need ";
    string c = b + a;          
}

Donc, dans cet exemple, je dois appeler la chaîne " a " définie dans la fonction button1_Click() à partir de la fonction button2_Click().

Merci!!

7
Zbone

Habituellement vous le passeriez comme argument, comme ceci:

void Method1()
{
    var myString = "help";
    Method2(myString);
}

void Method2(string aString)
{
    var myString = "I need ";
    var anotherString = myString + aString;
}

Cependant , les méthodes de votre exemple sont des écouteurs d'événement. Généralement, vous ne les appelez pas directement. (Je suppose que vous pouvez , mais je n’ai jamais trouvé un cas où un devrait .) Ainsi, dans ce cas particulier, il serait plus prudent de stocker la valeur dans un emplacement commun de la classe. deux méthodes à utiliser. Quelque chose comme ça:

string StringA { get; set; }

public void button1_Click(object sender, EventArgs e)
{ 
   StringA = "help";
}

public void button2_Click(object sender, EventArgs e)
{
    string b = "I need ";
    string c = b + StringA;
}

Notez cependant que cela se comportera très différemment dans ASP.NET. Donc, si c'est ce que vous utilisez, vous voudrez probablement aller plus loin. La raison pour laquelle il se comporte différemment est que le côté serveur est "sans état". Ainsi, chaque clic sur le bouton provenant du client créera une toute nouvelle instance de la classe. Par conséquent, le fait de définir ce membre de classe dans le gestionnaire d'événements de premier clic de bouton ne sera pas répercuté lors de son utilisation dans le gestionnaire d'événements de second clic de bouton.

Dans ce cas, vous souhaiterez rechercher l'état persistant dans une application Web. Les options comprennent:

  1. Valeurs de page (champs cachés, par exemple)
  2. Biscuits
  3. Variables de session
  4. Variables d'application
  5. Une base de données
  6. Un fichier côté serveur
  7. Un autre moyen de conserver des données côté serveur, etc.
28
David

Vous devez déclarer string a dans la portée de la class, et non de la méthode, pour le moment, il s'agit d'une "variable locale".

Exemple:

private string a = string.Empty;

public void button1_Click(object sender, EventArgs e) 
{  
    a = "help"; 
} 

public void button2_Click(object sender, EventArgs e) 
{ 
    //this is where I need to call the string "a" value from button1_click  
    string b = "I need"; 
    string c = b + a;           
} 

Vous pouvez maintenant accéder à la valeur de votre "champ privé" a de n’importe où dans votre class qui, dans votre exemple, sera un Form.

8
DaveShaw

Refactorisez cela dans un appel de méthode (ou une propriété) pour pouvoir accéder à la valeur de a ailleurs dans votre application:

public String GetStringAValue() {
    return "help";
}

public void button1_Click(object sender, EventArgs e) {
    string a = GetStringAValue();
}

public void button2_Click(object sender, EventArgs e) {
    string a = GetStringAValue();
    string b = "I need";
    string c = b + a;
}

Notez également que vous pouvez utiliser des déclarations de type implicites. En effet, ce sont des déclarations équivalentes:

string a = GetStringAValue();
var a = GetStringAValue();
1
Yuck
class SomeClass
{
    //Fields (Or Properties)
    string a;

    public void button1_Click(object sender, EventArgs e)
    { 
        a = "help"; //Or however you assign it
    }

    public void button2_Click(object sender, EventArgs e)
    {
        string b = "I need";
        string c = b + (a ?? String.Empty); //'a' should be null checked somehow.
    }
}
0
m-y

make est une variable de niveau classe (variable globale) ou crée un getter et un setter pour String a, pour nommer quelques options.

0
northpole

Tu ne peux pas faire ça. string a est une déclaration de variable local. On l'appelle "local" car il n'est accessible "localement" qu'au bloc dans lequel il se produit.

Pour rendre la variable visible aux deux méthodes, vous pouvez créer un champ dans la classe contenant les méthodes. Si les méthodes sont dans des classes différentes, la solution devient plus compliquée.

0
phoog

Vous ne pouvez pas faire cela parce que ces variables sont dans différents scopes (pensez que c'est caché). Le seul moyen d'y parvenir est de déplacer un élément de la classe de formulaire principale:

public partial class Form1 : Form
{
    string a;

    // etc ...
}
0
BlackBear