🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

3回答

530閲覧

windowsフォームのプロパティを別のクラスで参照

asam1005

総合スコア8

C#

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

0グッド

0クリップ

投稿2019/10/04 03:02

編集2019/10/04 04:21

windowsフォームで電卓を作っていて、計算結果をLogとして別のTextBoxに書き込みたいのですが書き込まれません。
別のclassで書き込むプログラムを作って、引数で書き込む場所を参照しようとしているのですが。。。

Formのついているclassの中ならうまくいくのですが、
classを分けてしまうと別のやり方で参照しないといけないのでしょうか?
よろしくお願いいたします。

こちらがプログラムの一部です。

C#

1namespace Test 2{ 3 public partial class Calculator : Form 4 { 5 string InputNum = null; //input number 6 string Operator = null; //input operator 7     private Write write = new Write(); 8 9 public Calculator() 10 { 11 InitializeComponent(); 12 } 13 private void Operator_Click(object sender, EventArgs e) 14 { 15 write.WriteIn(Log.Text, InputNum, Operator); 16 } 17 } 18 19 public class Write 20 { 21 public void WriteIn(String file, String No, String Op) 22 { 23 file += No + "" + Op + ""; 24 } 25 } 26}

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

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

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

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

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

guest

回答3

0

ベストアンサー

あなたのソースをそのまま流用すると

C#

1namespace Test 2{ 3 public partial class Calculator : Form 4 { 5     private Write write = new Write(); 6 7 public Calculator() 8 { 9 InitializeComponent(); 10 } 11 private void Operator_Click(object sender, EventArgs e) 12 { 13 write.WriteIn(Log, InputNum, Operator); 14 } 15 } 16 17 public class Write 18 { 19 public void WriteIn(TextBox Log, String No, String Op) 20 { 21 Log.Text+= No + "" + Op + ""; 22 } 23 } 24}

これで行けると思います。
Log=書き込みたいTextBoxオブジェクトとしてます。

投稿2019/10/04 04:29

Youbun

総合スコア125

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

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

asam1005

2019/10/04 04:47

解決いたしました。ありがとうございます! いただいたURLなどでもっと勉強します。 本筋を別の部分まで教えていただき、ありがとうございましたm(_ _)m
guest

0

C#のstringは値型的な振る舞いをするので,
Write.WriteIn(String file, String No, String Op)の中でfileの内容を変更したつもりでも,大元のLog.Textは変化しません.

string A = "Hello"; string B = A; B = "Cat";

とかしても,Aが"Hello"のままなのと一緒です.

string B = A;
で,AもBも 「内容が"Hello"なデータ」 を参照している状態に.

B = "Cat";
で,Bの参照先が,別の新しい 「内容が"Cat"なデータ」に変更された.(Aが参照しているデータに影響がない)

file += ... についても,
file = file + ...
と考えれば一緒.

投稿2019/10/04 04:10

編集2019/10/04 05:21
fana

総合スコア11985

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

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

asam1005

2019/10/04 04:24

String file の引数としてLog.Textを引用しているという記述のつもりなのですが、記述が間違っているでしょうか?
Youbun

2019/10/04 05:15 編集

嘘ばっかりなので削除しました。 申し訳ございませんでした。
asam1005

2019/10/04 04:45

ありがとうございます。 参照渡しと値渡しとがあるんですね。。。。 渡せる型と渡せない型があるのかな。。。? 勉強いたしますm(_ _)m わかりやすい説明とURLまでありがとうございます!
fana

2019/10/04 04:46

「c# string 参照型 値型」とかでググると良いかと.
fana

2019/10/04 04:51

(元のコードで何故うまくいかないのかが理解されないままに解決されたような気がしないでもない… とりあえず↑でググっておくことを推奨)
asam1005

2019/10/04 04:52

ありがとうございます! 調べてみます!!
Youbun

2019/10/04 04:56

すみません・・・言葉足らずでした。 「引数に修飾詞を何もつけなかったら」 ・クラス型を引数にした場合は基本的に「参照渡し」になる ・データ型を引数にした場合は基本的に「値渡し」になる と思っているのですがあってますか? 全く自信がなくなってますので 質問外で申し訳ありませんが Yes/No だけでも教えてください!
Zuishin

2019/10/04 04:58

違います。リンク先を読んでみてください。公式情報にも同じことが書いてありますが、こちらの方が読みやすいと思います。
asam1005

2019/10/04 04:58

あれ?確かに。。。 WriteのclassでLog.Textが取れなかったのは何となくわかりましたが 引数でString fileにLog.Textを入れたのにうまくいかない理由がわかってないですね。。。。 エラー文は出ていないけど、値渡しはできないとか。。。何でしょうか。。。 すみません、勉強します。
Youbun

2019/10/04 05:02

クラスはもともと「参照型」だから 引数としては「値渡し」だけど挙動は参照渡しみたいな挙動になっている。 ということでしょうか?
asam1005

2019/10/04 05:02

•値渡し: メソッド内で引数の値を書きかえても、呼び出し元には影響しない。 •参照渡し(ref): メソッド内での値の書き換えの影響が呼び出し元に伝搬する。 すみません、意味が分かりました。 値渡しだと元のデータは書き換わらないんですね。。。。 え、なんでTextBoxを持ってくるとできんでしょうか。。。。。
Zuishin

2019/10/04 05:03

また混乱する初心者が。fana さんの「参照型」「値型」が正しい言葉です。Youbun さんの「参照渡し」「値渡し」は誤解に基づく表現で、リンク先も間違っているので、刷り込みが定着する前に正しい言葉を覚えてください。
Youbun

2019/10/04 05:13

>asamさんへ すみません! 私が参照型の値渡しと参照渡しを同じように考えていたせいで 嘘ばっかりの教え方になってしまいました。 私のコメントは忘れて、ZuishinさんのURLを見てみてください! >Zuishin、fanaさんへ 自分の理解不足を棚に上げて要らんことばっかり書いてすみませんでした! また、勉強させていただきありがとうございました。 自分のうっすら知識が固まって楽しかったです! 今後は邪魔しない様気を付けますのでご勘弁を!
Zuishin

2019/10/04 05:15

> 前の例は、参照によって値型を渡す例でした。 ref キーワードを使用して、参照渡しで参照型を渡すこともできます。 参照渡しで参照型を渡す「こともできます」と書いてありますが、デフォルトで参照渡しなら、このような表現にはなりません。
Zuishin

2019/10/04 05:16

Youbun さん、これは間違えている人が非常に多いし、それに比例して間違った情報が氾濫しているので、恥じることは何もありません。ただ、次から正しい情報を伝えていただければと思います。
guest

0

  • 電卓の引数にtextboxのインスタンスを渡してそこから更新
  • フォームに結果格納/更新用のプロパティを設置して、電卓の引数にフォームのインスタンスを渡す

などなど

投稿2019/10/04 03:09

y_waiwai

総合スコア88038

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

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

asam1005

2019/10/04 04:35

まだ初めて3日ほどなのであまり用語がわかっていませんが、 ここでのtextboxのインスタンスとは、windowsフォームのデザインに配置したtextboxのプロパティにあるTextで大丈夫でしょうか? 説明不足ですみません。。。 フォームには電卓の画面用と結果格納用のtextboxの二つを配置していて、結果格納用のtextboxに書き込もうとしています。 そのtextboxの名称をLogとしていて、引数にLog.Textをとることで渡せていると思っていたのですが、やり方が違うのでしょうか?
y_waiwai

2019/10/04 04:38

いや、Logを渡します んで、関数の中で file.Text = なんちゃらとすれば
asam1005

2019/10/04 04:41

ありがとうございます! textboxをそのまま渡せるのは知りませんでした。。。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問