web-dev-qa-db-ja.com

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

したがって、この例では、関数button1_Click()から関数button2_Click()で定義された文字列 "a"を呼び出す必要があります。

ありがとう!!

11
Zbone

通常次のように、引数として渡します。

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

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

ただし、例のメソッドはイベントリスナーです。通常、直接呼び出すことはありません。 (私はあなたがcanだと思いますが、-shouldのインスタンスを見つけたことはありません。)したがって、この特定のケースでは、共通の2つのメソッドが使用するクラス内の場所。このようなもの:

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では非常に異なる動作をすることに注意してください。だからそれがあなたが使っているものなら、あなたはおそらくそれをさらに一歩進めたいと思うでしょう。これが異なる動作をする理由は、サーバー側が「ステートレス」であるためです。したがって、クライアントからのボタンをクリックするたびに、まったく新しいクラスのインスタンスが生成されます。そのため、最初のボタンクリックイベントハンドラーでそのクラスレベルのメンバーを設定しても、2番目のボタンクリックイベントハンドラーでそれを使用しても反映されません。

その場合は、Webアプリケーション内の永続化状態を調べる必要があります。オプションは次のとおりです。

  1. ページ値(非表示フィールドなど)
  2. クッキー
  3. セッション変数
  4. アプリケーション変数
  5. データベース
  6. サーバー側ファイル
  7. サーバー側などでデータを永続化するその他の方法.
32
David

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になります。

8
DaveShaw

@Devidの回答に同意しますが、必要なエンティティのクラスを作成し、変数を引数として渡さずにソリューション全体で使用することを好みます。

Classname.variableName;

のために

 Class argumentData{
public static string firstArg= string.Empty;
public static string secArg= string.Empty;
}

関数にデータを割り当てているとしましょう

void assignData()
{
argumentData.firstArg="hey";
argumentData.secArg="hello";
}

別の方法で使用したい場合

void showData()
{
Console.WriteLine("first argument"+argumentData.firstArg);
Console.WriteLine("sec argument"+ argumentData.secArg);
}

お役に立てれば!

1
Shubham Khare

ここでセッションを使用できます

public void button1_Click(object sender, EventArgs e)
{ 
string a = "help";
Session["a"]=a;
}
public void button2_Click(object sender, EventArgs e)
{ 
string d=Session["a"].ToString();        
string b = "I need ";
string c = b + d;          
}
1
sivabalan

これをメソッド呼び出し(またはプロパティ)にリファクタリングして、アプリケーションの他の場所で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();
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はクラスレベルの変数(グローバル変数)であるか、String aのゲッターとセッターを作成して、いくつかのオプションを指定します。

0
northpole

それはできません。 string aローカル変数宣言です。発生したブロックに「ローカル」でのみアクセスできるため、「ローカル」と呼ばれます。

変数を両方のメソッドから見えるようにするために、メソッドを含むクラスにフィールドを作成できます。ただし、メソッドが異なるクラスにある場合、ソリューションはさらに複雑になります。

0
phoog

これらの変数は異なる scopes にあるため、これを行うことはできません(非表示になっていると考えてください)。これを実現する唯一の方法は、メインフォームクラスでを移動することです。

public partial class Form1 : Form
{
    string a;

    // etc ...
}
0
BlackBear