DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クラスの値渡しは不可能?

環境/言語:[Win2000 VS2003 C# ウィンドウズアプリ]
分類:[.NET]

かなり初心者な質問で申し訳ありません。
C#のユーザー定義クラスは参照型だそうですが、
VBで言うByValみたいなことはC#では不可能でしょうか。

MyClass data = new MyClass();
MyClass tmp = new MyClass();
tmp = data;

本当のデータはdataに入っています。
tmpの内容を画面に表示して編集作業を行い、
OKボタンが押されたらtmpをdataにコピー、
CANCELボタンが押されたらtmpを無視する。
みたいなことをしたいだけなのですが、
tmp = dataが参照渡しなので出来ません。

この場合どのようにすべきなのでしょうか。
よろしくお願いします。

また、メンバ変数の値を一個づつコピーすることや、
構造体を使うことは避けたいです。
> C#のユーザー定義クラスは参照型だそうですが、
> VBで言うByValみたいなことはC#では不可能でしょうか。
> 本当のデータはdataに入っています。
> tmpの内容を画面に表示して編集作業を行い、
> OKボタンが押されたらtmpをdataにコピー、
> CANCELボタンが押されたらtmpを無視する。
> みたいなことをしたいだけなのですが、
> tmp = dataが参照渡しなので出来ません。

全体はよくわからないので、本当にオブジェクトのコピーが必要
なのかどうかわかりませんが、オブジェクトのコピーを
作るには、ICloneableを実装させて、MemberwiseCloneを
使うといいと思います。ただ、DeepCopyを行う際は
再帰的にならないように注意しなければならないと思います。
  • 題名: Re[1]: クラスの値渡しは不可能?
  • 著者: 魔界の仮面弁士
  • 日時: 2005/03/22 18:00:57
  • ID: 9997
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> C#のユーザー定義クラスは参照型だそうですが、
> VBで言うByValみたいなことはC#では不可能でしょうか。

Visual Basic でいうところの

《宣言》
Public Shared Sub ByValVB(ByVal X As ArrayList)
Public Shared Sub ByRefVB(ByRef X As ArrayList)

《呼出》
MyVBClass.ByValVB(AL1)
MyVBClass.ByRefVB(AL2)

は、C♯では、

《宣言》
public static void ByValCS( ArrayList X)
public static void ByRefCS(ref ArrayList X)

《呼出》
MyCSClass.ByValCS( AL1);
MyCSClass.ByRefCS(ref AL2);

になりますね。


> OKボタンが押されたらtmpをdataにコピー、
コピーの実装例として。

[.NETでいきまっしょい!] - [IClonableとIDisposable]
http://santamartadotnet.hp.infoseek.co.jp/documents/vbdotnet/clonableanddisposable.html
う〜ん、コピーするだけで結構ややこしいんですね。
ICloneableを調べてるんですが、
使いこなすのにちょっと練習してきますので、
とりあえずここで解決としておきます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板