C#のクラスで値渡しをする方法は?

このQ&Aのポイント
  • C#のクラスで値渡しをしたい場合に参照渡しになる問題について、解決方法を探しています。
  • 現在、Microfoft visual stdio 2005を使用してC#でWindousアプリケーションを開発していますが、クラスのオブジェクトを代入すると参照渡しになってしまい、値渡しをしたいと思っています。
  • 構造体を使う方法も考えましたが、クラスを拡張したいため、クラスで解決する方法を知りたいです。どのような方法があるでしょうか?
回答を見る
  • ベストアンサー

C#のクラスで値渡しをする

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが クラスのオブジェクトを代入すると、値渡しをしたいのに参照渡しになってしまい困っています。 ソースコードで説明すると class Car {   public int a; } Car bike = new Car(); Car bike_a = new Car(); Car bike_b = new Car(); bike_a = bike; bike_b = bike; bike_a.a = 10; bike_b.a = 20; この場合の出力結果(?)を bike_a.a = 10 にしたいのです。 構造体を使う方法もあるのですが、このクラスは拡張したいので、できればクラスで使いたいのです。 なにかこの問題を解決するような方法はないでしょうか? ちょと抽象的な質問で申し訳ないのですが、よければ御回答をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

(C#の)オブジェクトは参照渡しなので、コピーはそのオブジェクトのメソッドを利用するというのが正しい作法。 C#だと、ICloneableインターフェイスのCloneメソッドを実装するのが良いデザインでしょう。 参考URLのところによると、Object.MemberwiseClone()なるメソッドが存在しているようですので、これを使って実装するのが便利そうですね。

参考URL:
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_006/csharp_abc01.html
lain_003
質問者

お礼

おお! こんな関数があったのですね! まだプログラミングを初めたばかりなので、いろいろ新鮮な事が学べました^^。 親切な御回答ありがとうございました。

関連するQ&A

  • 子クラスのオブジェクトに親クラスのオブジェクトを代入

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが 子クラスのオブジェクトに、親クラスのオブジェクトを代入する方法が分からなくて困っています><。 ソースコードで説明すると class Car { } class Bike:Car { } Car oya = new Car(); Bike kodomo = new Car(); kodomo = oya;//これはエラーになる というかんじです。 これが代入できるような方法はないでしょうか? かなり抽象的な質問ですが、よろしければ御回答をお願いします。

  • C#でオブジェクトの配列を使う

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが オブジェクトを配列でせんげんし、オブジェクトのメンバを使うとエラーが出てしまいます。ソースコードで説明すると using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsApplication1 {   public partial class Form1 : Form   {     public class car     {       int a;       public void set(int i)       {         a = i;       }     }     public Form1()     {       InitializeComponent();     }     private void label1_Click(object sender, EventArgs e)     {       car[] bike = new car[1];       bike[0].set(1);//ここでひっかかる     }   } } これをじっこうするとデバックは通るのですが、label1_Clickイベントが発生すると、「NULLの場所を参照しています」という意味のエラーが出てしまいます。 C#はほとんど初心者なので、初歩的なミスだとおもうんですが、 よろしければ御回答をお願いします。

  • Labelコントロールに数字を代入する

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが LabelにInt型の変数の中身を代入する方法がわかりません。 ソースコードで書くと int a = 10; label1.Text = a;//こうするとInt型をString型に変換できませんと         //で る 参考書などには数字を表示したいならTextBoxを使いなさいとよく書かれているのですが、今のプログラムはユーザーに数字の表示を変えられるといけないので、悩んでいます。 どなたかLabelにInt型を入れる方法か、ユーザーがコントロールできないようなLabelに代わるものを教えていただけないでしょうか>< よろしくお願いします。

  • Form1で宣言したインスタンスをForm2で使う

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが、あるフォームで宣言したインスタンスを別のフォームで使う方法がわかりません。具体的にソースコードで説明すると using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace tesuto {   public partial class Form1 : Form   {     class Car     {       public int a;     }     public void Form1_Load(object sender, EventArgs e)     {       Car bike = new Car();//ここで宣言したインスタンスを       bike.a = 10;       Form2 fm2 = new Form2(this);       fm2.Show();     }   }   public partial class Form2 : Form   {     public void Form2_Load(object sender, EventArgs e)     {       int b;       b = bike.a;//ここでこのように使いたい     }   } } ということです。 前も似たような質問をさせていただき、たくさんの回答をいただいたにも関わらず自分のプログラム能力が低く、理解できませんでした><。なのでよければ、回答は言葉だけではなくこの上のソースコードを基にして(コピペ貼り付けなどで)、すこしでいいですのでソースコードを書いていただけませんでしょうか。 また、プログラミングを初めてまだ間もないので、すこし初心者向けでお願いします。 質問する側なのに色々要求をして申し訳ないのですが、もし御面倒でなければ御回答をお待ちしております。 よろしくおねがいします。 

  • 【C#】クラスのコンストラクタ引数参照渡しでエラー

    C#の.NETでWindowsアプリを作成しております。 C++/CLI経験はありますが、C#は全くの素人です。 AクラスからBクラスに、Cクラスを参照渡しで渡し、 BクラスにてCクラスのメンバ変数の値を書き換えた後、 Aクラスでその値を使用するといったプログラムを作成しようと思っています。 Bクラスを生成する際に、コンストラクタの引数渡しにて、 Cクラスを渡す書き方をしたのですが、下記エラー エラー CS0051: アクセシビリティに一貫性がありません。 パラメータの型 'ref Test.C' のアクセシビリティは メソッド 'Test.B.B(ref Test.C)' よりも低く設定されています。 が発生してしまい、解決法が分かりません。 何か根本的なことが間違っているのでしょうか。。 解決策をご存知の方おられましたら、ご教示お願い致します。 下記にサンプルコードを記載します。 【Aクラス】 B b = new B( C c ); 【Bクラス】 namespace Test { public partial class B : Form { public B(ref C c) // コンストラクタ { InitializeComponent(); } } } 【Cクラス】 namespace Test { class C { public int hoge; } }

  • new クラス名(); が必要なとき   必要ないとき

    class Sample { public static void main(String args[]) { Car car1; car1 = new Car(); Car car2; car2 = car1; car1 = null; ・・・・・・・      ・・・・・・・      ・・・・・・・ } } 途中省略してあるのですが、このようなソースコードがありました。 car2オブジェクトはなぜ宣言だけでいいのでしょうか? car1のように、new Car(); は何故必要ないのでしょうか?これで何故代入ができるのかわかりません。 どのようなときに、new クラス名(); が必要なのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • ループ中にlabel_clickの読み込みを認識する

    開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが ループ中に、ラベルがクリックされたことを認識したいのです。ソースで説明すると private void Form1_Load(object sender, EventArgs e) {   while(1)   {     if(label1がクリックされたら・・・)     {     }     else if(label2がクリックされたら・・・)     {     }   } } このようなif文を書きたいのですが、よい方法はないでしょうか? よければ御知恵を貸してください。よろしくおねがいしますm(__)m

  • Access2000 フォーム間での値渡しについて

    お世話になります。 フォームA、Bがありまして、AからBに値を渡し、Bフォームの初期表示としたいのですが、 下記ロジックにて値を渡した後にBフォームを開くと消えてしまします。 ************************************************** 呼出し先(Bフォーム) Public Sub 値渡しで展開(値) Text=値 DoCmd.OpenForm B 呼出し元(Aフォーム) Call B.値渡しで展開(値) ************************************************** VBにて同じ方法にて実現できているのですが、VBAでは異なるのでしょうか? ご回答よろしくお願いいたします。

  • 参照・値渡しについて

    下記プログラム(ソース1)を実行すると「1」という値が出力されます。しかし、2行目をprivate static int a;とすると「0」という値が出力されます。 オブジェクトは参照渡しで基本データ型は値渡しと思ったのですが、2行目の値をString型で行ったところ全く変更されていない値が出力されました。(ソース2) 一体どういうことでしょうか? 回答のほどよろしくお願い致します。 (ソース1) public class X{ private static int a[] = new int[1]; public static void main(String []args){ modify(a); System.out.println(a[0]); } public static void modify(int a[]){ a[0]++; } } (ソース2) public class X{ static String a = "a"; public static void main(String []args){ modify(a); System.out.println(a); } public static void modify(String a){ a = "b"; } }

    • ベストアンサー
    • Java
  • Java:クラスのインスタンスを配列の要素にする?

    問題集で次のプログラムを見掛ました。 A[] array = {new B(), new C()}; クラスA型の配列変数arrayにクラスBとクラスCのインスタンスを要素として代入しています。 このような配列を作成した場合、具体的にどのような使い方があるのでしょうか? 簡単なプログラムを書いて頂けると嬉しいです。 よろしくお願いします。

専門家に質問してみよう