• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#イベントで作る変数の受け渡し)

C#イベントで変数の受け渡しをする方法

このQ&Aのポイント
  • C#初心者の方へ、C#イベントで変数の受け渡しをする方法について教えます。
  • Windowsのフォームアプリケーションにおいて、ボタンのクリックイベントにファイルを読み込む処理を登録する場合、イベントで定義した文字列の配列を使用します。
  • しかし、この配列はイベントが終了すると存在しなくなってしまいます。C#にはグローバル変数という概念はないため、擬似的に作る必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

グローバルの定義が分かりませんし、何がしたいのかよく分かりません。 フォーム内だけで有効であって欲しいならprivateメンバ変数にすればいいし、 アプリケーション全体で有効であって欲しいなら、staticクラスでも用意すれば良いでしょう。 また、配列の要素数が毎度毎度変化したとしても、受け口が配列を受ける変数ならば 特に問題ないように思えますが。 【Form1.cs】 namespace WindowsApplication1 {   public partial class Form1 : Form   {     private string[] hoge;     private void button2_Click(object sender, EventArgs e)     {       //string[] hoge; ←元々コードしていると思われる宣言       string[] fuga = { "a", "b", "c", "d" }; ←ファイルを読んだと仮定       hoge = fuga;       Console.WriteLine(hoge.Length);       ////HogeClass.hoge = fuga; ←////部分をコメントインするとHogeClassを使う       ////Console.WriteLine(HogeClass.hoge.Length);       string[] piyo = { "a", "b" };       hoge = piyo;       Console.WriteLine(hoge.Length);       ////HogeClass.hoge = piyo;       ////Console.WriteLine(HogeClass.hoge.Length);     }   } } 【HogeClass.cs】 using System; using System.Collections.Generic; using System.Text; namespace WindowsApplication1 {   public class HogeClass   {     public static string[] hoge;   } }

isamrx73
質問者

お礼

 長年分からなかったことがお陰様で、解決しました。有り難う御座います。

isamrx73
質問者

補足

確認のためですが、HogeClassで public static string [] hoge;この時点では、hogeの大きさは不明ですよね。 Form1でもprivate string [] hogeが有ります。 HogeClass.hoge = hoge;とすれば、HogeClassでForm1のローカルのhoge すなわち、huga配列を使えると言うことですか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

> HogeClass.hoge = hoge;とすれば、HogeClassでForm1のローカルのhoge > すなわち、huga配列を使えると言うことですか? そうです。 staticにするとかインスタンスを作るとか、いろんなやり方が ありますが、新たなクラスを使おうが、メンバ変数を設けようが、 受け口が渡す変数の型と一緒なら入ります。 これは別にC#に限った話ではありません。

isamrx73
質問者

お礼

 長年挑戦しては、挫折してました。ここがよく分からなかったのが、原因の一つです。少し分かりました。コンソールアプリケーションは昔の知識で幾分分かったような気もしてましたが、ウィンドーズアプリケーションは更に複雑です。  基本を良く理解してれば、そうでも無いのかもしれませんが、デバッカーなしには何も作れない、素人なので、楽しみに作りたいのですが、苦労を背負うことにもなりそうです。  今後も分からないことが有れば質問しますので、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C側で得た変数をC++の変数に流し込みたいです。

    C側で得た変数をC++の変数に流し込みたいです。 現在、C++で 次のように、 入力ストリームから1行分の文字列を読み込んで、 読み込んだ文字列を「cmd」に流し込んだ際に、 cmdに代入された文字列が「get」であると、 他のファイルで定義されている「doget」という関数が 実行されるようになっています。 ----------- std::string cmd; std::getline(cin, cmd); void nod::execute(const std::string& cmd) { std::stringstream ss(cmd); std::string command; ss >> command; if (command == "get") { std::string key = "baseball" ; std::string val = stand.doget(key); } } ----------- これを、 以下のように、 (1) C言語側にある「a」という変数にある値を C++側のkeyに流しこんで、 (2) また、C側にあるsign配列内の文字列を C++側の「cmd」に代入したいと思っています。 C側 --------- /* C側の「a」配列の値を、上記C++側の「key」に代入したい */ char a[] = "www.gehohogetest.jp"; /* 上記C++側の「cmd」変数に、C側の配列で定義されている"get"という文字列を代入したい */ char sign[]= "get"; --------- その場合、C側とC+側をどう記述すれば、 希望を叶えることが出来るでしょうか。 アドバイスいただけるとありがたいです。 以上どうぞ宜しくお願い致します。

  • visual C++2008 Express 変数宣言等について

    sea_clear_skyです。 質問させて頂きます。 <環境> WindowsXP SP3 VisualC++ 2008 Express 現在、VisualC++ 2008 Expressでプログラムの勉強をしています。 VisualC++ Expressでコンソールアプリケーションじゃなく、 Windowsフォームアプリケーションで、変数の宣言(配列)の仕方と message::showで、変数の値を表示させる方法がわかりません。 C/C++などの、コンソールアプリケーションの方法では エラーがでて、実行できなかったので、 Windowsフォームアプリケーション用の記入の仕方があるのでは ないかと思っています。 初心者なので、わからない状態です。 VC++ 2008 EXPRESS 変数宣言 VC++ 2008 EXPRESS 変数 VC++ 2008 EXPRESS データ型 message;;show vc++ VC++ 2008 リファレンス VC++ 2008 入門 等など、たくさんのキーワードでホームページを 検索しましたが、知りたいことが載っている ホームページを見つけることができませんでした。 参考HPや解決方法について、ご教授お願いします。 すいませんが、よろしくお願いします。

  • C# Object型の受け渡し

    C++のプログラマです。 以下のコードを通すとdataが配列として配置されます。 Object data; excute(out data); excuteメソッドの引数定義はVARIANT * です。 ここで質問です。 1)C++の概念ではこのような使い方は考えられないのですが、   C#ではあたりまえでしょうか? 2)この場合、配列数と配列の要素を取出す方法を教えてくれませんか? 以上、宜しくお願い致します。

  • C言語とfortranでのデータの受け渡しについて

    はじめましてc_f_gaussと申します。 現在fortranで動的に配列を得るためにC言語を使用し 配列を確保しそのアドレスをfortranで定義してある 配列のアドレスと交換したいのですがどのようにしたら よいでしょうか? 今の段階ではC言語側でアドレスを交換してもfortran 側に戻ると元のアドレスに戻ってしまいます。 fortranとC言語でデータ受け渡すには何か必要な手続き があるのでしょうか?

  • c# 配列変数の宣言について

    c#の配列変数の宣言についてですが、 以下の2つの宣言は同じことなのでしょうか。 (1)int[] num = {1,2,3}; (2)int[] num = new int{1,2,3}; 本では(2)のような定義していますが何かルールのようなものがあるのでしょうか。 宜しくお願いします。

  • 【C#】クラスのメンバ変数のアクセス修飾子の省略

    初歩的な質問かもしれませんが、 C#にてクラスのメンバ変数を定義する際、 public int x; public int y; のように、変数一つずつにアクセス修飾子をつけなければいけないのでしょうか? 例えば、C++/CLIだと public: int x; int y; のように書くことで、個別に修飾子をつけなくても、 複数の変数に対してアクセスレベルを設定できたのですが。。 ご存知の方おられましたら、ご教示お願い致します。

  • メンバ変数に関して

    現在、C++にてプログラム作成しております。 1点プログラミングを行っている中で疑問になった点があります。 アイデア・方法等があれば教えて頂けると幸いです。 現在、メンバ変数として配列を定義したプログラムを作成しております。 そのメンバ変数を同クラス内のたくさんのメソッドから呼び出して処理を行っているのですが、そのメンバ変数の配列数を固定配列数ではなく、可変な配列数にしたいと考えております。 プログラムの実行後に取得した値をメンバ変数の配列数にしたいのです。 このように、メンバ変数の配列数の可変可を実施することは可能でしょうか?

  • 配列と他の変数のメモリ領域重複の問題について質問

    dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。 プログラムにはC言語を用いています。環境は「MPLAB C30 v3.31」、「MPLAB LINK30 v3.31」「MPLAB v8.85」です。 状況としてはunsigned char型で要素数320の配列をグローバル宣言します。そしてmain関数やその他の関数内でローカル変数を宣言するとその変数が配列の中に存在することになってしまうというものです。色々試したところ、そのローカル変数をstaticで宣言するとそのような症状は出なくなりました。 この現象には、初期化をする関数内でカウンタとしてローカル変数を宣言し、for文で配列を0でクリアさせようとしたところ、MPLABSIMでデバッグすると永久ループしたことから気づきました。Watchを用いて確認したところ配列の中にそのカウンタ変数が配置されていたため最終的に自分自身を0でクリアしてしまうことで永久ループしてしまうことがわかりました。 なぜこうなるのかよくわかりません。この配列以外にはおおきな領域を必要とする変数は宣言していませんのでData memoryの容量的な問題ではないと思っています。staticで宣言すれば何とかなりますが、これでは無駄なメモリを消費してしまいます。また、絶対アドレス指定をする方法もありますが、「ignoring address attribute applied to automatic 変数名」というwarningがでて結局出来ませんでした。 。 このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。 この問題のために先に進めず、大変困っております。どうかご教授ください。 もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。 不足がございましたら補足しますのでお教え下さい。

  • 本当にPublicな変数(配列で)

    複数のフォームがあるVisualBasicのプログラムを作っているのですが、そのすべてのフォームからアクセス(値の変更も含める)できる配列の変数というのはないのでしょうか?  Public 文を使ってみると、「定数、固定長文字列、配列、ユーザー定義型文字列、およびDeclareステートメントは、オブジェクトモジュールのパブリックメンバとしては使用できません。」 というエラーメッセージがでます。 解決法を教えてください。

  • エクセルのVBAでオブジェクトの配列変数は使えますか?

    VBですとオブジェクトの配列変数というか、コピーしたときに自動的に配列になってしまいますが、エクセルのVBAの場合でオブジェクトの配列変数は使えますか? なにをしたいかというと、ボタンが多すぎて一つ一つにプログラム定義は面倒、そこで配列にしてまわすことにしたいのですが、エクセルで可能でしょうか。 どなたかお願いします。