質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

46891閲覧

別クラスから変数を受け取りたい

fender0131

総合スコア121

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2015/10/15 01:22

編集2015/10/15 04:08

以下のプログラムで別クラスの変数xを受け取り、引数として別クラスに渡したいのですが、どのような処理が必要でしょうか?

ご指導ご鞭撻の程よろしくお願い致します。

public partial class Form1 : Form
{
public float a ; // textboxの値を取ってきます
public float b ; // textboxの値を取ってきます

public void keisan() { Test.test(a,b) } public void save_bt_Click(object sender, EventArgs e) { Save.save ( x ); // クラス「Test」内の変数、x を受け取り、引数で渡したい }

}

public partial class Test
{
public float x;

public static void test ( float a, float b ) { Test t = new Test(); t.x = a + b; }

}

public class Save
{
public static void save( float x)
{
StreamWriter sw = new System.IO.StreamWriter(
@"C:\data\file",
true,
System.Text.Encoding.GetEncoding("shift_jis")
);

sw.WriteLine(String.Format("C {0}", x); }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

勘違いしてたらごめんなさい。

Testクラスのインスタンスはどのように管理するつもりであるのか明確にする必要があります。
たとえば以下のような
A. save_bt_Click イベントサブスクライバ内でNewして使い捨てるのか
B. Form1 クラス内の初期化時など別のメソッド実行時にインスタンスを作っておくのか
C. シングルトンなのか

上記が明確になれば、あとは素直に渡してあげればいいかと 。

C#

1 // 前述のAのような場合 2 public void save_bt_Click(object sender, EventArgs e) 3 { 4 Test testObject = new Test(); 56 Save.save ( a , b , testObject .x ); 78 testObject = null; 9 } 10 11 // 前述のBのような場合 12 public void save_bt_Click(object sender, EventArgs e) 13 { 14 // たとえばForm1クラスのインスタンスメンバに testClassInstance 変数が定義されているとして 15 Save.save ( a , b , testClassInstance.x ); 16 } 17 18 // 前述のCのような場合 19 public void save_bt_Click(object sender, EventArgs e) 20 { 21 // たとえばTest クラスにInstance メソッドを解して唯一のインスタンスを返すような定義を作った場合 22 Save.save ( a , b , Test .Instance().x ); 23 }

投稿2015/10/15 01:57

Ryzna

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryzna

2015/10/15 02:30

yubaさんへの回答に対するコメントの内容を受けて: インスタンスを持たない という事は変数x自体を静的メンバとして定義する必要が出てきます。 例) public float x = 30; ↓ public static float x = 30; こうする事でTestクラスが使える全てのメソッドからx変数に対して読み書きが出来るようになると思います。但し、変数である為、変更される事を前提とします。 逆に変更されたくなくて(現在のコードの場合、常に30を返したい)場合は変数ではなく、定数として定義するほうがいいかもしれません。 例) public float x = 30;    ↓ public const float x = 30; 定数とすることで変更できなくなり、常に30が得られるようになります。 今回の質問は特定の何らかの機能を実現する為というより、質問者さんの技術的疑問を解消する為の質問と捕らえておりますが、前提が漠然としすぎていて正直どのようにも答えが作れる(=決定的な回答が出せない)状態です。もし前者であるならばそれぞれのクラスの扱い方や件の変数の使用方法なども明記されると良いかもしれません。
fender0131

2015/10/15 04:17

少し返事が遅れてしまいました。 お答えありがとございます。 プログラムを少し書き換えさせて頂きました。 内容としましては、textbox1・2に数値を打ち込み、save_btを押すと、2つの値の合計がファイルに落とされるものとしました。 この場合、Ryzna様が教えて下さった、Aパターンですと、xにnullが入ってきてしまう(xが初期化される?)ので、思い通りの結果を出力さることができませんでした。 B・Cパターンを使用することで対応できますでしょうか?
fender0131

2015/10/15 04:58

プログラムを書き換えてもう一度投稿させて頂きますので、よろしければまたお答え願えませんでしょうか?
Ryzna

2015/10/16 08:32

返信遅くなってしまって申し訳ありません。 更新していただいたコードに対して再度提案させていただきます。 以下3点を踏まえて 1. Test クラスは何らかの理由によって partialでなければならないものとし追求しない 2. Test.testメソッドは何らかの理由によって static 出なければならないものとし追求しない 3. Form1.keisanメソッドが呼ばれるタイミングは追求しない(=keisanを実行せずに保存ボタンを押す場合もあると考える) 書くとしたらとりあえず以下のようになります。 public partial class Form1 : Form { public float a ; // textboxの値を取ってきます public float b ; // textboxの値を取ってきます public Test test = null; public void keisan() { test = Test.test(a,b); } public void save_bt_Click(object sender, EventArgs e) { if (test != null) Save.save ( x ); // クラス「Test」内の変数、x を受け取り、引数で渡したい } } public partial class Test { public float x; public static Test test ( float a, float b ) { Test t = new Test(); t.x = a + b; return t; } } public class Save { public static void save( float x) { StreamWriter sw = new System.IO.StreamWriter( @"C:\data\file", true, System.Text.Encoding.GetEncoding("shift_jis") ); sw.WriteLine(String.Format("C {0}", x); } } 以下は突っ込みも多いかもしれませんが、もう少しわかりやすい構造の例として public partial class Form1 : Form { public float a ; // textboxの値を取ってきます public float b ; // textboxの値を取ってきます public float? result; public Calculator m_Calculator; public Saver m_Writer; public void Form1() { result = null; m_Calculator = new Calculator(); m_Writer = new Saver(); } // 強引ですが、保存処理と加算処理を分離しなければならない状況の例として加算ボタンがあるものとします。 public void btnAdd_Click(object sender, EventArgs e) { result = m_Calculator.Add(a,b); } public void save_bt_Click(object sender, EventArgs e) { if (result.HasValue) { m_Writer.Save(result.Value); result = null; // 連打対応(笑 } } } // 計算クラス (この例においては静的ではないことに意味はないです。) public class Calculator { public float Add(float x, float y) { // とりあえず加算結果を返していますが、設計次第では「小数点何位までに丸める~」といった処理を追加したりする事も出来る return x + y; } } // 保存クラス (この例においては静的ではないことに意味はないです。) public class Saver { public void Save(float data) { var sw = new System.IO.StreamWriter( @"C:\data\file", true, System.Text.Encoding.GetEncoding("shift_jis") ); sw.WriteLine(String.Format("C {0}", data); } } というところでしょうか。 そもそもいわゆるWindowsフォームアプリケーションで考えた場合、且つ、単一フォーム内で完結する一連の動作において、インスタンスメンバを極力使わない実装方針は余り効果のあるものとは思えていません。
fender0131

2015/10/20 05:29

お返事大変遅くなり申し訳ございませんでした。 ソースまで貼って頂きありがとうございます。 大変参考になりました。
guest

0

Testクラスのインスタンスは、存在しないかもしれませんし複数存在するかもしれません。
「Testクラスのxフィールド」と言われてもどのインスタンスのxフィールドでしょうということになってしまいます。

よって「渡しようがない(渡したくてもどれを渡すのか決められない)」が答になります。

もう少し、どんなデータの流れを実現したいのかを明確化してみましょうか。

投稿2015/10/15 01:32

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fender0131

2015/10/15 01:51

お答えありがとうございます もう少しお付き合い願えませんでしょうか? 上のプログラムを少し改良いたしました。 Testクラスのインスタンスは、存在しないことと致します。 この場合ですと渡すことはできないのでしょうか? イメージとしてはこのような形で渡せるんではないかと思っていたのですが、 受け取ることができませんでした。 public void save_bt_Click(object sender, EventArgs e) { hoge = Test.x Save.save ( a , b , hoge ); } お手数おかけして申し訳ございませんが、どなた様かお答え願えませんでしょうか。
yuba

2015/10/15 03:12

Ryznaさんの回答の方のRyznaさんのコメントの通りです。xがstaticフィールドであればその形で参照可能です。
fender0131

2015/10/15 04:20

お答えありがとうございます。 staticフィールドで行えないプログラムであることが分かりました。 インスタンスを持たせ、それを利用し、データの受け渡しをするような形になりようです。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問