C # ссылается на переменную из другого метода - PullRequest
8 голосов
/ 16 февраля 2012

Я новичок в 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 ]

29 голосов
/ 16 февраля 2012

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

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

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

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

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. Cookies
  3. Переменные сеанса
  4. Переменные приложения
  5. База данных
  6. Файл на стороне сервера
  7. Некоторые другие средства сохранения данных на стороне сервера и т. Д.
8 голосов
/ 16 февраля 2012

Вам необходимо объявить 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.

1 голос
/ 16 февраля 2012

Переведите это в вызов метода (или свойство), чтобы вы могли получить доступ к значению 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();
0 голосов
/ 12 июня 2015

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

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;

0 голосов
/ 16 февраля 2012
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 голосов
/ 16 февраля 2012

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

public partial class Form1 : Form
{
    string a;

    // etc ...
}
0 голосов
/ 16 февраля 2012

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

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

0 голосов
/ 16 февраля 2012

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

...