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

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

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

Re[20]: 参照型の引数にrefをつけるとき


(過去ログ 64 を表示中)

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

■37050 / inTopicNo.1)  参照型の引数にrefをつけるとき
  
□投稿者/ cio (1回)-(2009/06/12(Fri) 01:40:12)

分類:[C#] 

はじめまして。WindowsXP、VS2008C#、XNAでゲームを作成している途中なのですが、
その中でキャラクターの複製を行う際、ref修飾詞に悩まさています。
コンソールで簡略化したコードを作りましたので、よろしくおねがいします。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class SubData
    {
        private int testdata;
        //保持している値を取得
        public int GetData() { return testdata; }

        /// <summary>
        /// データを入力するコンストラクタ
        /// </summary>
        /// <param name="data">値</param>
        public SubData(int data)
        {
            testdata = data;
        }
    }

    public class MainDataClass : ICloneable
    {
        private SubData m_RefData;

        /// <summary>
        /// 自分のデータをコピーする(ref有り)
        /// </summary>
        /// <param name="Dest"></param>
        public void CopyData(ref MainDataClass Dest)
        {
            Dest = (MainDataClass)Clone();
        }

        /// <summary>
        /// 自分のデータをコピーする(ref無し)
        /// </summary>
        /// <param name="Dest"></param>
        public void CopyDataNoRef(MainDataClass Dest)
        {
            Dest = (MainDataClass)Clone();
        }

        /// <summary>
        /// 簡易コピーでクローンを生成する
        /// </summary>
        /// <returns>クローンobject</returns>
        public object Clone()
        {
            return MemberwiseClone();
        }

        /// <summary>
        /// デバック用出力
        /// </summary>
        public void OutPut()
        {
            Console.WriteLine(m_RefData.GetData());
        }

        /// <summary>
        /// 参照データを設定する
        /// </summary>
        /// <param name="rd"></param>
        public void SetRefData(SubData rd)
        {
            m_RefData = rd;
        }
    }

    //派生クラス
    public class ChildMain : MainDataClass
    {
        public int dummydata = 0;
    }

    class Program
    {
        static void Main(string[] args)
        {
            //今後生成するコピーは全てこのSubを参照している状態にしたい
            SubData Sub = new SubData(10);

            //コピー生成元となるインスタンスを生成
            MainDataClass Org = new MainDataClass();
            //参照元を設定
            Org.SetRefData(Sub);
            //ここではちゃんと10が出力される
            Org.OutPut();

            //テスト(1)ref有りコピー
            MainDataClass CopyData1 = new MainDataClass();
            Org.CopyData(ref CopyData1);
            //10が出力される
            CopyData1.OutPut();

            //テスト(2)ref無しコピー
            MainDataClass CopyData2 = new MainDataClass();
            Org.CopyDataNoRef(CopyData2);
            //出力できない
            CopyData2.OutPut();//(※実行時エラー)

            //テスト(3)派生クラスにref有りコピー
            ChildMain CopyChild1 = new ChildMain();
            //↓ref有りだとコピーが出来ない
            Org.CopyData(ref CopyChild1);//(※コンパイルエラー)
            //↓キャストも出来ない
            Org.CopyData(ref (MainDataClass)CopyChild1);//(※コンパイルエラー)

            //テスト(4)派生クラスにref無しコピー
            ChildMain CopyChild2 = new ChildMain();
            //↓ref無しだとコピーはできるが…
            Org.CopyDataNoRef(CopyChild2);
            //出力できない
            CopyChild2.OutPut();//(※実行時エラー)

            //理解できない疑問オマケ
            List<MainDataClass> list = new List<MainDataClass>();
            list.Add(CopyData2);
            Org.CopyData(ref list[0]);//(※コンパイルエラー)
        }
    }
}

引用返信 編集キー/
■37051 / inTopicNo.2)  Re[1]: 参照型の引数にrefをつけるとき
□投稿者/ たくボン (183回)-(2009/06/12(Fri) 03:16:37)
No37050 (cio さん) に返信
> はじめまして。WindowsXP、VS2008C#、XNAでゲームを作成している途中なのですが、
> その中でキャラクターの複製を行う際、ref修飾詞に悩まさています。
> コンソールで簡略化したコードを作りましたので、よろしくおねがいします。

んで、何が知りたいの?
refと引数の動作?それともジェネリックのitemがrefに指定できない理由?
引用返信 編集キー/
■37056 / inTopicNo.3)  Re[2]: 参照型の引数にrefをつけるとき
□投稿者/ cio (2回)-(2009/06/12(Fri) 11:08:42)
2009/06/12(Fri) 11:11:12 編集(投稿者)

> んで、何が知りたいの?
最終的にしたいことは
//今後生成するコピーは全てこのSubを参照している状態にしたい
MainDataClassのCopyDataメソッドによって、参照情報(m_RefData)が正しくコピーされるようにしたいわけです。



もちろん、
> refと引数の動作?それともジェネリックのitemがrefに指定できない理由?
こちらも分かるなら知りたいです。たくボンさん是非ご教授願います。
引用返信 編集キー/
■37057 / inTopicNo.4)  Re[3]: 参照型の引数にrefをつけるとき
□投稿者/ 囚人 (370回)-(2009/06/12(Fri) 11:22:06)
・テスト(2)(4)が実行時エラーになる理由
オブジェクトを引数に渡すと「普通は」コピーされる。
それが、参照型だったら参照がコピー、構造体だったら値がコピーされる。
故に
public void CopyDataNoRef(MainDataClass Dest)
{
	Dest = (MainDataClass)Clone();
}
は、メソッドに入った時点で作られた「コピー」に Clone しているだけでメソッドを抜けたらすぐに消えている。


・テスト(3)がコンパイルエラーになる理由
C/C++ で言うポインタのポインタだから型に互換性がない。


・理解できない疑問オマケがコンパイルエラーになる理由
インデクサの呼び出しはメソッドだから。プロパティやメソッドを渡すのも同様。「値」を直接渡す必要がある。

引用返信 編集キー/
■37059 / inTopicNo.5)  Re[4]: 参照型の引数にrefをつけるとき
□投稿者/ cio (3回)-(2009/06/12(Fri) 11:44:30)
No37057 (囚人 さん) に返信
回答ありがとうございます!

> ・テスト(2)(4)が実行時エラーになる理由
なるほど……これは理解できました。
refはC++での "*" に近い感じなのですね。


> ・テスト(3)がコンパイルエラーになる理由
> C/C++ で言うポインタのポインタだから型に互換性がない。
ポインタのポインタといわれて「あぁ、なるほど!」と把握できました。
エラーになる理由は分かったのですが、どうにかキャストする方法はないんでしょうか?
(ref MainDataClass)CopyChild1
これではダメみたいですし…

> ・理解できない疑問オマケがコンパイルエラーになる理由
> インデクサの呼び出しはメソッドだから。プロパティやメソッドを渡すのも同様。「値」を直接渡す必要がある。
つまりリストから直接ではなく、一旦変数に受け取れば問題ないということでしょうか?
List<MainDataClass> list = new List<MainDataClass>();
list.Add(CopyData1);//←CopyData2からCopyData1に修正
MainDataClass mdc = list[0];
Org.CopyData(ref mdc);
mdc.OutPut();
引用返信 編集キー/
■37067 / inTopicNo.6)  Re[5]: 参照型の引数にrefをつけるとき
□投稿者/ 囚人 (371回)-(2009/06/12(Fri) 12:41:28)
>ポインタのポインタといわれて「あぁ、なるほど!」と把握できました。
>エラーになる理由は分かったのですが、どうにかキャストする方法はないんでしょうか?
>(ref MainDataClass)CopyChild1
>これではダメみたいですし…

先にキャストしておいて渡すとか。

//テスト(3)派生クラスにref有りコピー
ChildMain CopyChild1 = new ChildMain();
MainDataClass p = CopyChild1;
Org.CopyData(ref p);
p.OutPut();


>つまりリストから直接ではなく、一旦変数に受け取れば問題ないということでしょうか?
>List<MainDataClass> list = new List<MainDataClass>();
>inlist.Add(CopyData1);//←CopyData2からCopyData1に修正
>MainDataClass mdc = list[0];
>Org.CopyData(ref mdc);
>mdc.OutPut();

MainDaataClass が参照型だったらそれで良いと思いますよ。
要するに
MainDataClass mdc = list[0];
でコピーが発生していないならば。
例えばインデクサで
public MainDataClass this[int index]
{
	get
	{
		MainDataClass c = (MainDataClass)this.Close();
		return c;
	}
}
的なコードを書かれてたら、自分の意図通りなのか注意が必要ですね。list[0]に影響がないので。

引用返信 編集キー/
■37107 / inTopicNo.7)  Re[6]: 参照型の引数にrefをつけるとき
□投稿者/ cio (4回)-(2009/06/12(Fri) 19:27:09)
2009/06/12(Fri) 20:25:33 編集(投稿者)


> 先にキャストしておいて渡すとか。
>
> //テスト(3)派生クラスにref有りコピー
> ChildMain CopyChild1 = new ChildMain();
> MainDataClass p = CopyChild1;
> Org.CopyData(ref p);
> p.OutPut();
急がば回れ、ワンクッション置く形にすればいいのですね。
これで何とか解決しそうです!


> MainDaataClass が参照型だったらそれで良いと思いますよ。
> 要するに
> MainDataClass mdc = list[0];
> でコピーが発生していないならば。
> 例えばインデクサで
> public MainDataClass this[int index]
> {
> get
> {
> MainDataClass c = (MainDataClass)this.Close();
> return c;
> }
> }
> 的なコードを書かれてたら、自分の意図通りなのか注意が必要ですね。list[0]に影響がないので。
なるほど、インデクサをこういう風にすることもできるんですね……
余計な小細工は仕込んでいないので、多分大丈夫だと思います。


ひとまず問題になっていた点は解決できるとおもいます、囚人さん御教授ありがとうございました!
引用返信 編集キー/
■37110 / inTopicNo.8)  Re[7]: 参照型の引数にrefをつけるとき
□投稿者/ cio (5回)-(2009/06/12(Fri) 20:29:43)
……と、思ったのですが。

どちらも、型変換用に新しく作った方の変数に新しく複製を生成するだけで、
根本的な解決になっていないようです(´・ω・`)根本的にやり方を変えるしかないですかね……
引用返信 編集キー/
■37113 / inTopicNo.9)  Re[8]: 参照型の引数にrefをつけるとき
□投稿者/ 囚人 (374回)-(2009/06/12(Fri) 23:13:35)
ただの調査用のコードだと思ってました。
ref 使う機会なんてそんなにありますか? 普通に戻り値で返す方がシンプルですけど。
引用返信 編集キー/
■37119 / inTopicNo.10)  Re[9]: 参照型の引数にrefをつけるとき
□投稿者/ cio (6回)-(2009/06/13(Sat) 01:11:23)
2009/06/13(Sat) 02:21:02 編集(投稿者)

そうですね〜refを使わない別の方法を考えて見ますか(´・ω・`)
戻り値で返すように組もうとしてるんですがやっぱ型で詰みますね〜;
引用返信 編集キー/
■37125 / inTopicNo.11)  Re[10]: 参照型の引数にrefをつけるとき
□投稿者/ cio (7回)-(2009/06/13(Sat) 12:50:36)
頭を冷やしてよくよく考えれば
やろうとしてることはrefとか関係なしに、派生クラスに基底クラスを代入しようとしてるだけですねw失礼いたしました
あと、一部間違った事を回答してしまった事は恥ずかしがったり、逆ギレしたりしなくていいと思います。
結局その言葉遣いからよほどの大物だと思われる某ボンさんよりは、回答してくれただけありがたいです。勉強になりました。

今度質問するときはもうちょっと有意義な内容になるよう気をつけます。ありがとうございましたm(_ _)m
解決済み
引用返信 編集キー/
■37126 / inTopicNo.12)  Re[11]: 参照型の引数にrefをつけるとき
□投稿者/ 囚人 (375回)-(2009/06/13(Sat) 13:03:20)
>あと、一部間違った事を回答してしまった事は恥ずかしがったり、逆ギレしたりしなくていいと思います。
>結局その言葉遣いからよほどの大物だと思われる某ボンさんよりは、回答してくれただけありがたいです。勉強になりました。

ん〜?
なんか間違ってるところありました?ちょっと自分では気づいていないので教えてほしいんですけど。

引用返信 編集キー/
■37133 / inTopicNo.13)  Re[12]: 参照型の引数にrefをつけるとき
□投稿者/ cio (8回)-(2009/06/13(Sat) 19:41:31)
2009/06/13(Sat) 19:50:03 編集(投稿者)


No37126 (囚人 さん) に返信
> なんか間違ってるところありました?ちょっと自分では気づいていないので教えてほしいんですけど。

この辺ですかね。インデクサのほうも同様です
> //テスト(3)派生クラスにref有りコピー
> ChildMain CopyChild1 = new ChildMain();
> MainDataClass p = CopyChild1;
> Org.CopyData(ref p);
> p.OutPut();

CopyChlid1にデータをコピーしたいのに、これじゃあ結局
MainDataClass p = new MainDataClass();
Org.CopyData(ref p);
p.OutPut();
こう書いたのと同じことだということです。

>オブジェクトを引数に渡すと「普通は」コピーされる。
と囚人さんに教えていただきましたが、これでは引数で行わなれるコピー処理を、自分が変わりに行っているだけですよね?

引用返信 編集キー/
■37135 / inTopicNo.14)  Re[13]: 参照型の引数にrefをつけるとき
□投稿者/ 囚人 (376回)-(2009/06/13(Sat) 21:50:15)
>CopyChlid1にデータをコピーしたいのに、これじゃあ結局
>MainDataClass p = new MainDataClass();
>Org.CopyData(ref p);
>p.OutPut();
>こう書いたのと同じことだということです。

違いますけど。


>>オブジェクトを引数に渡すと「普通は」コピーされる。
>と囚人さんに教えていただきましたが、これでは引数で行わなれるコピー処理を、自分が変わり>に行っているだけですよね?

違いますけど。


全然理解してなくても恥ずかしがったり、逆ギレしたりしなくてもいいと思いますよ。

引用返信 編集キー/
■37136 / inTopicNo.15)  Re[13]: 参照型の引数にrefをつけるとき
□投稿者/ Azulean (403回)-(2009/06/13(Sat) 22:25:48)
今回のコードという前提条件の下で、結果的に同じであったとしても、それぞれの意味するところは違います。

No37133 (cio さん) に返信
> CopyChlid1にデータをコピーしたいのに、これじゃあ結局
> MainDataClass p = new MainDataClass();
> Org.CopyData(ref p);
> p.OutPut();
> こう書いたのと同じことだということです。

意味は違います。
しかし、今のやりたいことと思われる、「CopyDataメソッドでCloneメソッドを用いて作った別のインスタンスに差し替えること」しか考えないのであれば、結果的に同じにはなります。
入れ物がMainDataClassであればよく、pに何が入っていようと関係がないからです。(pの値は使われずに捨てられるため)

そもそもの問題として、インスタンスの差し替えが前提であれば、refでなくてoutで良いと思いますし、1つの引数しかoutがないのでれば戻り値でも十分です。


> >オブジェクトを引数に渡すと「普通は」コピーされる。
> と囚人さんに教えていただきましたが、これでは引数で行わなれるコピー処理を、自分が変わりに行っているだけですよね?

ここで「コピー」と書くとややこしいかなぁ。
MainDataClassはクラスですし、オブジェクト自体がコピーされるのではなく、参照するための入れ物(変数)が別にできて、同じ実体が参照される入れ物が2つできると言うべきだろうか?

今回のコードでは、入れ物自体が別物になっている点では同じですが、「引数で行われるコピー処理」とは意味は異なります。




今回やりたかったことは、インスタンスの差し替えだったのかどうかが気にはなります。

MainDataClassあるいはその派生クラスに対して、あるMainDataClassからのメンバー変数をコピーしたいということであれば、
MainDataClassにCopyFromインスタンスメソッドでも作って、コピー元のMainDataClassを渡してその中でメンバー変数をコピーすれば良いのでは?
そうすれば、MainDataClassの派生クラスも同じインスタンスメソッドを持ちますので、内容を同じにすることはできますね。
また、派生クラスの独自のメンバー変数もフォローしたいのであれば、overrideすれば動作を追加できますし。
引用返信 編集キー/
■37138 / inTopicNo.16)  Re[14]: 参照型の引数にrefをつけるとき
□投稿者/ cio (9回)-(2009/06/13(Sat) 23:38:25)
2009/06/13(Sat) 23:43:58 編集(投稿者)

No37135 (囚人 さん) に返信
> >CopyChlid1にデータをコピーしたいのに、これじゃあ結局
> >MainDataClass p = new MainDataClass();
> >Org.CopyData(ref p);
> >p.OutPut();
> >こう書いたのと同じことだということです。
>
> 違いますけど。
>
>
> >>オブジェクトを引数に渡すと「普通は」コピーされる。
> >と囚人さんに教えていただきましたが、これでは引数で行わなれるコピー処理を、自分が変わり>に行っているだけですよね?
>
> 違いますけど。
>
>
> 全然理解してなくても恥ずかしがったり、逆ギレしたりしなくてもいいと思いますよ。

そうですね、私の意図と全然違いますね。
行ってる傍から逆切れさせてスミマセン……どうやらこちらのやりたい意図がまったく伝わっていなかったようです。ホント申し訳ない(´・ω・`)
あと、どの辺が違うのかももう少し説明していただけるとこちらも理解できますので助かります。

No37136 (Azulean さん) に返信
> 意味は違います。
意味が違うということがよく分かりません。コンパイラが吐くコードが変わるとかそういう意味でしょうか?
自分でも言っていますが、結局私がしたかったことはCopyChild1にOrgの値をコピーしたかった訳で、
結局のところどちらのコードもそれは達成できていない、という意味で同じだと書いたのです。分かりにくくて申し訳ない。

> しかし、今のやりたいことと思われる、「CopyDataメソッドでCloneメソッドを用いて作った別のインスタンスに差し替えること」しか考えないのであれば、結果的に同じにはなります。
> 入れ物がMainDataClassであればよく、pに何が入っていようと関係がないからです。(pの値は使われずに捨てられるため)
>
> そもそもの問題として、インスタンスの差し替えが前提であれば、refでなくてoutで良いと思いますし、1つの引数しかoutがないのでれば戻り値でも十分です。
refもoutも同じで大差ないと思っていました。こちらの確認不足ですみません。
今回の場合のような時はoutの方が適切なようですね。勉強になりました。

>>>オブジェクトを引数に渡すと「普通は」コピーされる。
>>と囚人さんに教えていただきましたが、これでは引数で行わなれるコピー処理を、自分が変わりに行っているだけですよね?
>
> ここで「コピー」と書くとややこしいかなぁ。
> MainDataClassはクラスですし、オブジェクト自体がコピーされるのではなく、参照するための入れ物(変数)が別にできて、同じ実体が参照される入れ物が2つできると言うべきだろうか?
> 今回のコードでは、入れ物自体が別物になっている点では同じですが、「引数で行われるコピー処理」とは意味は異なります。
要するにポインタが複製されて、CopyDataメソッド内ではその複製されたポインタに対して新しいインスタンスが生成されるということですよね?


> 今回やりたかったことは、インスタンスの差し替えだったのかどうかが気にはなります。
>
> MainDataClassあるいはその派生クラスに対して、あるMainDataClassからのメンバー変数をコピーしたいということであれば、
> MainDataClassにCopyFromインスタンスメソッドでも作って、コピー元のMainDataClassを渡してその中でメンバー変数をコピーすれば良いのでは?
今回の簡略化したコードではそれでもいいかもしれませんが、実装しているコードでは、クラス変数の種類が多すぎてひどいことになります。
また、新しい変数を基底クラスに追加した際にわすれずにメソッドに追記しなければならないため、なんとかならないかなぁと考えていたわけです。

引用返信 編集キー/
■37139 / inTopicNo.17)  Re[15]: 参照型の引数にrefをつけるとき
□投稿者/ Azulean (404回)-(2009/06/14(Sun) 00:09:05)
No37138 (cio さん) に返信
> ■No37136 (Azulean さん) に返信
>>意味は違います。
> 意味が違うということがよく分かりません。コンパイラが吐くコードが変わるとかそういう意味でしょうか?

ここで語る前提として、 No37067 の下記のコードのこととします。

> ChildMain CopyChild1 = new ChildMain();
> MainDataClass p = CopyChild1;
> Org.CopyData(ref p);
> p.OutPut();

この場合、ChildMainクラスのインスタンスとしてCopyChild1を作っており、それを基底クラスにキャストしてpとしているわけです。
CopyDataメソッド内で、as演算子を使って ChildMain instance = p as ChildMain; というようにキャストすれば元のChildMain型として扱える点が、 No37133 のコードとは違いますよね?
(pの実体がMainDataClass型そのものである場合、ChildMain型にキャストはできない)

> MainDataClass p = new MainDataClass();
> Org.CopyData(ref p);
> p.OutPut();

但し、CopyDataメソッドが引数に渡す時点でのpの中身を見ないという今の目的では、この差によって、結果は変化しません。

> 自分でも言っていますが、結局私がしたかったことはCopyChild1にOrgの値をコピーしたかった訳で、
> 結局のところどちらのコードもそれは達成できていない、という意味で同じだと書いたのです。分かりにくくて申し訳ない。

私も先の発言で書きましたが、結果は同じです。
途中の意味合いは異なるという点で「意味は違います」と書きました。


> 要するにポインタが複製されて、CopyDataメソッド内ではその複製されたポインタに対して新しいインスタンスが生成されるということですよね?
大雑把に言うとそういうことだと思います。


> また、新しい変数を基底クラスに追加した際にわすれずにメソッドに追記しなければならないため、なんとかならないかなぁと考えていたわけです。
今回の例で言えば、SubDataクラスにMainDataClassが持つべきメンバー変数を全て持たせて、MainDataClassに作るCopyFromメソッドでは、SubDataクラスのMemberwiseCloneを使えば良いのでは?
これであれば、SubDataクラスにメンバーを追加したときにもCopyFromメソッドに手を入れる必要はありません。

→SubDataクラスのインスタンスは新しいものに差し替えられるが、MainDataClassやその派生クラスのインスタンスは変わらない。
引用返信 編集キー/
■37140 / inTopicNo.18)  Re[16]: 参照型の引数にrefをつけるとき
□投稿者/ cio (10回)-(2009/06/14(Sun) 00:41:47)
2009/06/14(Sun) 02:36:36 編集(投稿者)

度重なる回答ありがとうございます!
No37139 (Azulean さん) に返信
> ■No37138 (cio さん) に返信
>>■No37136 (Azulean さん) に返信
> >>意味は違います。
>>意味が違うということがよく分かりません。コンパイラが吐くコードが変わるとかそういう意味でしょうか?
>
> ここで語る前提として、 No37067 の下記のコードのこととします。
>
>>ChildMain CopyChild1 = new ChildMain();
>>MainDataClass p = CopyChild1;
>>Org.CopyData(ref p);
>>p.OutPut();
>
> この場合、ChildMainクラスのインスタンスとしてCopyChild1を作っており、それを基底クラスにキャストしてpとしているわけです。
> CopyDataメソッド内で、as演算子を使って ChildMain instance = p as ChildMain; というようにキャストすれば元のChildMain型として扱える点が、 No37133 のコードとは違いますよね?
> (pの実体がMainDataClass型そのものである場合、ChildMain型にキャストはできない)
私のやり方が悪いのか、as演算子でnullしか返ってきません(´・ω・`)
できればその辺りのコードを示していただけると助かります。


> 私も先の発言で書きましたが、結果は同じです。
> 途中の意味合いは異なるという点で「意味は違います」と書きました。
理解しました。

>>要するにポインタが複製されて、CopyDataメソッド内ではその複製されたポインタに対して新しいインスタンスが生成されるということですよね?
> 大雑把に言うとそういうことだと思います。
こちらも理解です。



>>また、新しい変数を基底クラスに追加した際にわすれずにメソッドに追記しなければならないため、なんとかならないかなぁと考えていたわけです。
> 今回の例で言えば、SubDataクラスにMainDataClassが持つべきメンバー変数を全て持たせて、MainDataClassに作るCopyFromメソッドでは、SubDataクラスのMemberwiseCloneを使えば良いのでは?
> これであれば、SubDataクラスにメンバーを追加したときにもCopyFromメソッドに手を入れる必要はありません。
>
> →SubDataクラスのインスタンスは新しいものに差し替えられるが、MainDataClassやその派生クラスのインスタンスは変わらない。
初期の自分のレスを見返してみるとコピーされてほしいデータが複数あるというのは説明不足になっていました。申し訳ない。
やはりMainDataClass内のコピーされてほしいデータ群を構造体として纏めるのが一番簡単な解決策なのですね。
多少MainDataClassを手直しする手間はありますが、今後のことを考えるとこの方法が現状では一番よさそうです。
引用返信 編集キー/
■37141 / inTopicNo.19)  Re[17]: 参照型の引数にrefをつけるとき
□投稿者/ cio (11回)-(2009/06/14(Sun) 01:05:21)
>>(pの実体がMainDataClass型そのものである場合、ChildMain型にキャストはできない)
> 私のやり方が悪いのか、as演算子でnullしか返ってきません(´・ω・`)
> できればその辺りのコードを示していただけると助かります。
すみません、私のやり方が悪かったみたいです。
public void CopyData(ref MainDataClass Dest)
{
ChildMain ascast = Dest as ChildMain;
Dest = (MainDataClass)Clone();
}
変換できるというのはこういうことですよね。asは指している中身を見てキャストできるか判断する。勉強になりました、ありがとうございますm(_ _)m
引用返信 編集キー/
■37146 / inTopicNo.20)  Re[14]: 参照型の引数にrefをつけるとき
 
□投稿者/ cio (12回)-(2009/06/14(Sun) 11:00:48)
今回の件では私の説明が言葉足らずで、囚人さんに勘違い、的外れな回答をさせて申し訳ありませんでした。
しかし結果的に本筋ではないものの、沢山の事を学べて私にはよい勉強になりました。


本筋の詰まっていた問題は、
> 今回の例で言えば、SubDataクラスにMainDataClassが持つべきメンバー変数を全て持たせて、MainDataClassに作るCopyFromメソッドでは、SubDataクラスのMemberwiseCloneを使えば良いのでは?
> これであれば、SubDataクラスにメンバーを追加したときにもCopyFromメソッドに手を入れる必要はありません。
>
> →SubDataクラスのインスタンスは新しいものに差し替えられるが、MainDataClassやその派生クラスのインスタンスは変わらない。
この方法でひとまず解決しましたので、解決済みとさせていただきます。


Azuleanさん、囚人さんの尻拭い、ありがとうございました!
私のようなC#駆け出し者には
> >CopyChlid1にデータをコピーしたいのに、これじゃあ結局
> >MainDataClass p = new MainDataClass();
> >Org.CopyData(ref p);
> >p.OutPut();
> >こう書いたのと同じことだということです。
>
> 違いますけど。
>
>
> >>オブジェクトを引数に渡すと「普通は」コピーされる。
> >と囚人さんに教えていただきましたが、これでは引数で行わなれるコピー処理を、自分が変わり>に行っているだけですよね?
>
> 違いますけど。
>
>
> 全然理解してなくても恥ずかしがったり、逆ギレしたりしなくてもいいと思いますよ。
なんの解説も無いこの自己正当主張レスでは微塵も理解できませんでした。重ね重ねお礼申し上げます。

囚人さん、たくボンさんのお二方もありがとうございました。
例えどのような回答でも、レスがつかないのが質問者にとって酷な事態なので、
このトピックを開いていただき、質問に目を通していただけただけでとてもありがたい事です。


それでは、また何か詰まってしまった際は皆様のご助力を是非ともお願いいたします。本当にありがとうございました!

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

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -