C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: ref で受けた引数の使いまわしについて


(過去ログ 61 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■34893 / inTopicNo.1)  ref で受けた引数の使いまわしについて
  
□投稿者/ dote (1回)-(2009/04/13(Mon) 18:41:02)

分類:[C#] 

お世話になっています。早速の質問で恐縮なのですが

フォーム1から以下のようにデザイナで作成した Form2 を呼び出すのですが
引数として arg を渡して Form2の中で処理させたいと思っています。

Form2 fm2 = new Form2(ref arg);


Form2 のコンストラクタで

public Form2(ref int ARG)
{
InitializeComponent();
}

以下のように引数を受けて Form2 の他のメソッドから ARGの
値を書き換えるにはどのようにすれば良いのでしょうか?

ウェブや過去ログを検索しましたがヒントを見出すことができませんでした。
よろしくお願いいたします。

引用返信 編集キー/
■34895 / inTopicNo.2)  Re[1]: ref で受けた引数の使いまわしについて
□投稿者/ Hongliang (359回)-(2009/04/13(Mon) 18:50:59)
直接はできません。
クラスでラップすることになるでしょう。
引用返信 編集キー/
■34896 / inTopicNo.3)  Re[2]: ref で受けた引数の使いまわしについて
□投稿者/ dote (3回)-(2009/04/13(Mon) 19:01:06)
No34895 (Hongliang さん) に返信
> 直接はできません。
> クラスでラップすることになるでしょう。

アドバイスありがとうございます。教えていただいたキーワード
"C# クラス ラップ" で検索してみましたが具体的な方法を見つけられませんでした。
もう少し具体的に教えていただけると幸いです。m(_ _)
引用返信 編集キー/
■34897 / inTopicNo.4)  Re[1]: ref で受けた引数の使いまわしについて
□投稿者/ biac (87回)-(2009/04/13(Mon) 19:11:25)
biac さんの Web サイト
> フォーム1から以下のようにデザイナで作成した Form2 を呼び出すのですが
> 引数として arg を渡して Form2の中で処理させたいと思っています。
>
> Form2 fm2 = new Form2(ref arg);

なぜこんなバグの元を実装する必要があるんですかねぇ…

Form2の中で処理させた結果を、 フォーム1で利用するつもりなんだと思います。
フォーム1で利用するタイミングはどうする予定ですか? Form2 が閉じてから?


> public Form2(ref int ARG)
> {
> InitializeComponent();
> }
>
> 以下のように引数を受けて Form2 の他のメソッドから ARGの
> 値を書き換えるにはどのようにすれば良いのでしょうか?

このままではできません (たぶん)。
なんらかの参照型にラップしてやれば、 可能です。

private List<int> _args;

public Form2(List<int> args){
  this._args = args;
  InitializeComponent();
}

---

Form2 fm2 = new Form2(new List<int>(){ arg, });


しかし、 処理結果を公開するプロパティを Form2 に持たせておけばよいのではありませんか?

private _arg;

public Form2(int arg){
  this._arg = arg;
  InitializeComponent();
}

public int Result{ get; private set; }
// 処理結果は ↑ this.Result に書き込む

このような方法ではどうしてもダメで、 ref を使うしかない、 という理由をキチンと説明できるなら、 ref を使うこともありでしょう。
引用返信 編集キー/
■34898 / inTopicNo.5)  Re[2]: ref で受けた引数の使いまわしについて
□投稿者/ dote (4回)-(2009/04/13(Mon) 19:40:08)
No34897 (biac さん) に返信
>>フォーム1から以下のようにデザイナで作成した Form2 を呼び出すのですが
>>引数として arg を渡して Form2の中で処理させたいと思っています。
>>
>>Form2 fm2 = new Form2(ref arg);
>
> なぜこんなバグの元を実装する必要があるんですかねぇ…
>
> Form2の中で処理させた結果を、 フォーム1で利用するつもりなんだと思います。
> フォーム1で利用するタイミングはどうする予定ですか? Form2 が閉じてから?

アドバイスありがとうございます。

ご指摘のとおり Form2の中で処理させた結果を、フォーム1で利用したいと思っています。
Form2では valueChangedイベントのたびに refで受けた変数を書き換え
Form2 の閉じるボタンで Form2は close()させたいと思っています。
ちょっと無理があるでしょうか?
引用返信 編集キー/
■34901 / inTopicNo.6)  Re[3]: ref で受けた引数の使いまわしについて
□投稿者/ 倉田 有大 (551回)-(2009/04/13(Mon) 22:08:48)
2009/04/13(Mon) 22:25:30 編集(投稿者)
方法1

>しかし、 処理結果を公開するプロパティを Form2 に持たせておけばよいのではありませんか?

biacさんのが、最初は、一番お勧めだと思います。

方法2
class Data
{
   public int arg;
}

みたいなやつ作って、

Form2のプロパティに

class Form2
{
   public Data data;
}

Data data = new Data();
Form2 form2 = new Form2();
form2.Data = data;

biacさんの
>List<int>
ジェネリクスはまだdoteさんには難しいんじゃないかな。


方法3
static class CommonData
{
   static public int ARG;
}

こんな感じにグローバル変数みたいに使う手とかあります。
staticで宣言すると、Form1からもForm2からも見えます。
CommonData.ARGみたいに。

public Form2(ref int ARG)
C#でrefはあまり使ったこと無いなあ。Win32APIとのやりとりぐらいで。
そもそも、Form2のコンストラクタにわたしたら、コンストラクタからでたらARGがどうなるかお考えください。全然refで渡す意味がありません。

>ウェブや過去ログを検索しましたがヒントを見出すことができませんでした。

変数のスコープでぐぐってみてください。

>Form2 の閉じるボタンで Form2は close()させたいと思っています。
>ちょっと無理があるでしょうか?

普通です。というかdoteさんの質問は定期的によく見ます。

引用返信 編集キー/
■34902 / inTopicNo.7)  Re[4]: ref で受けた引数の使いまわしについて
□投稿者/ dote (5回)-(2009/04/13(Mon) 22:46:23)
No34901 (倉田 有大 さん) に返信
> 2009/04/13(Mon) 22:25:30 編集(投稿者)

アドバイスありがとうございます。
いただいたアドバイスを整理しながら実験してゆきたいと思います。
また結果をご報告、、ここにお集まりの皆さんにはお題が低レベルすぎて
報告するまでもないような気もしますが・・・><


> >Form2 の閉じるボタンで Form2は close()させたいと思っています。
> >ちょっと無理があるでしょうか?
>
> 普通です。というかdoteさんの質問は定期的によく見ます。

そうですか、変態的なコードを書いているのかと少し不安になっていたのですが(笑
でも、その類だったりして・・・(油汗

引用返信 編集キー/
■34903 / inTopicNo.8)  Re[4]: ref で受けた引数の使いまわしについて
□投稿者/ Azulean (354回)-(2009/04/13(Mon) 23:18:35)
個人的にはプロパティがお薦めかな。
Form2が表示されているまま、裏でForm1がその値を使うケースは少ないと予想しての判断となりますが。

No34901 (倉田 有大 さん) に返信
> C#でrefはあまり使ったこと無いなあ。Win32APIとのやりとりぐらいで。

コード分析ではこういったルールがありますね。
ref/outの使用は、原則的に控えるべきかと思っています。
http://msdn.microsoft.com/ja-jp/library/ms182131.aspx

引用返信 編集キー/
■34913 / inTopicNo.9)  Re[3]: ref で受けた引数の使いまわしについて
□投稿者/ Jitta on the way (299回)-(2009/04/14(Tue) 07:55:23)
No34898 (dote さん) に返信
> ■No34897 (biac さん) に返信
> >>フォーム1から以下のようにデザイナで作成した Form2 を呼び出すのですが
> >>引数として arg を渡して Form2の中で処理させたいと思っています。
> >>
> >>Form2 fm2 = new Form2(ref arg);
>>
>>なぜこんなバグの元を実装する必要があるんですかねぇ…
>>
>>Form2の中で処理させた結果を、 フォーム1で利用するつもりなんだと思います。
>>フォーム1で利用するタイミングはどうする予定ですか? Form2 が閉じてから?
>
> アドバイスありがとうございます。
>
> ご指摘のとおり Form2の中で処理させた結果を、フォーム1で利用したいと思っています。
> Form2では valueChangedイベントのたびに refで受けた変数を書き換え
> Form2 の閉じるボタンで Form2は close()させたいと思っています。
> ちょっと無理があるでしょうか?

Form2 で ValueChanged イベントを公開して、Form1 でハンドルする。
C# なら、イベント ハンドラーが呼ばれる順番も制御出来たんじゃなかったかな?(先入れ先呼びだったかな?)
引用返信 編集キー/
■34914 / inTopicNo.10)  Re[4]: ref で受けた引数の使いまわしについて
□投稿者/ 渋木宏明(ひどり) (1112回)-(2009/04/14(Tue) 08:45:53)
渋木宏明(ひどり) さんの Web サイト
> C# なら、イベント ハンドラーが呼ばれる順番も制御出来たんじゃなかったかな?(先入れ先呼びだったかな?)

イベントそのもの、あるいは代替え品を自作するなら、ハンドラの呼び出し淳の制御は可能です。

引用返信 編集キー/
■34920 / inTopicNo.11)  Re[5]: ref で受けた引数の使いまわしについて
□投稿者/ dote (6回)-(2009/04/14(Tue) 11:28:24)
No34914 (渋木宏明(ひどり) さん) に返信
>>C# なら、イベント ハンドラーが呼ばれる順番も制御出来たんじゃなかったかな?(先入れ先呼びだったかな?)
> 
> イベントそのもの、あるいは代替え品を自作するなら、ハンドラの呼び出し淳の制御は可能です。
> 

Azuleanさん   Jitta on the wayさん  渋木宏明(ひどり)さん

コメントありがとうございます。
スキルがなくて四苦八苦しているのですが
ちょっと,なまくらかも知れないんですけど

Form2 は From1 から呼ぶので Form1 の インスタンスのオブジェクトを
Form2 で拾えるならそれを使って Form1内のメンバーと言うか
C#ではフィールドと呼ぶそうなんですけど、にアクセスできない
のかとセコク考え始めまして、以下のようにやってみたのですが
結果は _ob. としても 続く m_data が候補に出てこないのですが
なぜなんでしょうか、根本的に間違っていますでしょうか?

          Form1 で
--------------------------------
string m_data;

Form2 fm2 = new Form2(this);
--------------------------------


           Form2 で
--------------------------------
object _ob;

public Form2(object OB)
{
	_ob = OB;

    InitializeComponent();
}


private oid textBox1_TextChanged(object sender, EventArgs e)
{
	_ob.m_data = textBox1.Text;
}
--------------------------------

引用返信 編集キー/
■34922 / inTopicNo.12)  Re[6]: ref で受けた引数の使いまわしについて
□投稿者/ επιστημη (1880回)-(2009/04/14(Tue) 11:43:48)
επιστημη さんの Web サイト
2009/04/14(Tue) 12:51:48 編集(投稿者)
> ...以下のようにやってみたのですが
> 結果は _ob. としても 続く m_data が候補に出てこないのですが
> なぜなんでしょうか、根本的に間違っていますでしょうか?

↓object型だから。 Form1なら(かつForm1.m_dataがpublicなら)うまくいくハズ。
> object _ob;

...なんだけど、好ましいやり方には思えません。
Form2が書き込めるのはForm1に限定されてしまう。
# Form1とForm2が互いに「べったり依存」しちゃうなり。

僕ならForm2が「値が変わったよ!」イベントを発行し、
Form1(のメソッド=delegate)がそのイベントを受理します。

class Form2 : Form {
  public delegate void ValueChangedDelegate(string value);
  public event ValueChangedDelagate ValueChanged;
  private void たとえばボタンがおされた(...) {
    if ( ValueChanged != null ) 
      ValueChanged(textBox1.Text); // 変更されたぞーっ!
  }
  ...
}

class Form1 : Form {
  private string m_data;
  private void GetValue(string val) {
    m_data = val; // 値を引き取る
  }
  private void たとえばForm2開けろボタンが押された(...) {
    Form2 form = new Form2();
    form.ValueChanged += GetValue; // イベントにアタッチ
    form.ShowDialog();
    form.ValueChanged -= GetValue; // イベントからデタッチ
  }
  ...
}

引用返信 編集キー/
■34926 / inTopicNo.13)  Re[7]: ref で受けた引数の使いまわしについて
□投稿者/ 倉田 有大 (555回)-(2009/04/14(Tue) 12:30:15)
>結果は _ob. としても 続く m_data が候補に出てこないのですが

キャストしないとそら。出てこないですよ
((Form1)_ob).m_data

επιστημηさんのイベント実装がこのましいとおもいますけど、たぶん、doteさんにはまだ難しいかな。

引用返信 編集キー/
■34929 / inTopicNo.14)  Re[8]: ref で受けた引数の使いまわしについて
□投稿者/ dote (7回)-(2009/04/14(Tue) 13:10:57)
No34926 (倉田 有大 さん) に返信
> >結果は _ob. としても 続く m_data が候補に出てこないのですが
>
> キャストしないとそら。出てこないですよ
> ((Form1)_ob).m_data
>

επιστημηさん 倉田有大さん

アドバイスありがとうございます。
お二人のアドバイスで「なまくら」な方でですが(汗
とりあえず望んでいたことはできるようになりました。

イベントの発行とデリゲートもマスターして近いうちにコードを
置き換えられるように勉強を重ねたいと思います。


それと、以下の επιστημηさんのアドバイスなのですが

>...なんだけど、好ましいやり方には思えません。
>Form2が書き込めるのはForm1に限定されてしまう。
># Form1とForm2が互いに「べったり依存」しちゃうなり。

これからしますと、今回のぼくのやり方は二つのフォームがべったり
依存するから望ましくない、と考えたらよろしいでしょうか?
ほかに何か問題点と言うか副作用的なことが生じ得ますでしょうか?

引用返信 編集キー/
■34932 / inTopicNo.15)  Re[9]: ref で受けた引数の使いまわしについて
□投稿者/ επιστημη (1881回)-(2009/04/14(Tue) 13:31:22)
επιστημη さんの Web サイト
> これからしますと、今回のぼくのやり方は二つのフォームがべったり
> 依存するから望ましくない、と考えたらよろしいでしょうか?

です。Form2がForm1専用。他に使い回しできない。

> ほかに何か問題点と言うか副作用的なことが生じ得ますでしょうか?

Form1.m_data の型/名前が変わったら即アウト。→ Form1の変更がForm2に影響を及ぼす。
「金輪際コードを修正/拡張/改良しない」なら別にいいけどさ、そんな確約できんでしょ?

引用返信 編集キー/
■34933 / inTopicNo.16)  Re[10]: ref で受けた引数の使いまわしについて
□投稿者/ dote (8回)-(2009/04/14(Tue) 13:47:53)
No34932 (επιστημη さん) に返信
>>これからしますと、今回のぼくのやり方は二つのフォームがべったり
>>依存するから望ましくない、と考えたらよろしいでしょうか?
>
> です。Form2がForm1専用。他に使い回しできない。
>
>>ほかに何か問題点と言うか副作用的なことが生じ得ますでしょうか?
>
> Form1.m_data の型/名前が変わったら即アウト。→ Form1の変更がForm2に影響を及ぼす。
> 「金輪際コードを修正/拡張/改良しない」なら別にいいけどさ、そんな確約できんでしょ?

ですね
いろいろと勉強のテーマをいただきました。
ありがとうございます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -