C# ссылка на переменную из другого метода

Я новичок в C# и мне действительно нужно знать, как вызвать/использовать строку из другого метода.

Например:

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;          
}

поэтому в этом примере мне нужно вызвать строку"a" определена в функции button1_Click() функции button2_Click()

спасибо!!

8 ответов


обычно вы бы передали это как аргумент, например:

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

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

методы в вашем примере несколько прослушивателей событий. Обычно ты не звонишь им напрямую. (Я полагаю, вы can, но я никогда не находил экземпляр, где один должны.) Поэтому в этом конкретном случае было бы более разумно хранить значение в общем месте в классе для двух используемых методов. Что-то вроде это:

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;
}

обратите внимание, однако, что это будет вести себя очень по-разному в ASP.NET - ... Поэтому, если это то, что вы используете, вы, вероятно, захотите сделать еще один шаг. Причина, по которой он ведет себя по-другому, заключается в том, что на стороне сервера "нет состояния."Таким образом, каждый щелчок кнопки, поступающий от клиента, приведет к совершенно новому экземпляру класса. Таким образом, установив этот член уровня класса в первом обработчике событий нажатия кнопки, он не будет отражаться при использовании его во втором нажмите кнопку обработчик событий.

в этом случае вы захотите посмотреть на сохраняющееся состояние в веб-приложении. Варианты включают:

  1. значения страниц (например, скрытые поля)
  2. печенье
  3. Переменные Сеанса
  4. Переменные Приложения
  5. База Данных
  6. Серверный Файл
  7. некоторые другие средства сохранения данных на стороне сервера и т. д.

нужно объявить string a в рамках class, не метод, на данный момент это "локальная переменная".

пример:

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;           
} 

теперь вы можете получить доступ к значению вашего "частного поля"a из любого места внутри вашего class что в вашем примере будет Form.


рефакторинг, который в вызов метода (или свойство), чтобы вы могли получить доступ к значению a в другом месте в вашем приложении:

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;
}

также обратите внимание, что вы можете использовать неявные объявления типов. По сути, это эквивалентные объявления:

string a = GetStringAValue();
var a = GetStringAValue();

make-переменная уровня класса (глобальная переменная) или создание геттера и сеттера для строки a, чтобы назвать пару параметров.


вы не можете этого сделать. string a Это объявление локальной переменной. он называется "локальным", потому что он доступен только" локально " для блока, в котором он происходит.

чтобы сделать переменную видимой для обоих методов, можно создать поле в классе, содержащем методы. Однако, если методы находятся в разных классах, решение становится более сложным.


вы не можете этого сделать, потому что эти переменные находятся в разных области (думайте, что это скрыто). Единственный способ достичь этого-переместить a в основной класс формы:

public partial class Form1 : Form
{
    string a;

    // etc ...
}

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.
    }
}

вы можете сохранить переменную в файл, а затем получить доступ к файлу позже, например:

public void button1_Click(object sender, EventArgs e)
{ 
    string a = "help";
    File.WriteAllText(@"C:\myfolder\myfile.txt", a); //Change this to your real file location
}

public void button2_Click(object sender, EventArgs e)
{
    string d = File.ReadAllText(@"C:\myfolder\myfile.txt");

    //this is where I need to call the string "a" value from button1_click 
    string b = "I need";
    string c = b + d; //Instead of a, put the variable name (d in this case)          
}

Если вы это сделаете, просто не забудьте поместить это в свой код:using System.IO;