ここから本文です

C#で 「クラス名 変数 = new クラス名()」 とインスタンスを生成する理由を教え...

sky********さん

2009/11/1020:19:12

C#で
「クラス名 変数 = new クラス名()」
とインスタンスを生成する理由を教えて下さい。

閲覧数:
36,711
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

abi********さん

編集あり2009/11/1105:28:15

[インスタンスを生成する理由]


プログラミングをするには、データを格納するための箱を用意する必要があります。
そのための方法のひとつとして、クラスがあります(クラスの他にも、構造体など)。
しかし、クラスは、その箱の作り方を示す設計図のようなもので、箱そのものではありません。
よって、質問に書かれているような書式で、実際にデータを入れる箱を用意する訳です。
(ここで言っている箱とは、質問文の「インスタンス」とか、「変数」のこと)
これが、インスタンスを生成する理由です。



質問者さんのMy知恵袋を見ると、既にC#は、少なくともある程度は経験済みです。
よって、インスタンスを生成すること自体は、よく御存知なのだと思います。
インスタンスを生成する時の書式についても。
なぜならば、プログラムを書き始めるには、インスタンスを生成しなければ始めようが無いのですから。

そこで、本質的な意味での理由を下記に説明します。





[動的生成と静的生成]


私も最初の頃は、質問の書式でインスタンス(オブジェクト)を生成する理由が不思議でした。

クラス名 オブジェクト = new クラス名();

のnewは、動的にオブジェクトを生成する場合です。
動的生成とは、コンパイル時(ビルド時)にオブジェクトが生成されるのではなく、プログラムが実行された時にオブジェクトが生成されるという物です。
確かに、動的生成は、場合によっては必要です。
例えば、ユーザーの操作に応じて、複数ある類似クラスの中から、適切なクラスを選んでオブジェクトを生成する場合です。
この手の処理は、動的(実行時)にオブジェクトを生成する必要があります。

しかし、その類の特別な処理をするのでは無い場合では、静的生成で十分なはずです。
すなわち、コンパイル時(ビルド時)にオブジェクトを生成する書式の

クラス名 オブジェクト;

で良いはずです。
しかし、これではエラーになってしまいます。
実は、型の種類によって、newで生成する場合と、newを使わない場合があって、クラスに関してはnewを使う必要があります。




[参照型の仕組み]


理由を説明する前にC++のポインタを知っている必要があります。
C#は、C++を改良した言語ですが、C++のポインタは難しいため、C#では、ポインタを使わない仕様になっています。
ポインタとは、メモリのアドレスを格納する物で、C++ではアドレスでメモリを直接制御することが可能です。
クラス名がabcというクラスがあるとして、下記のように記述するとします。

abc data;
abc* pData = &data; // オブジェクトdataのアドレスをポインタpDataに格納

この場合、オブジェクトdataで、クラスabcのメンバーメソッドや、メンバー変数を操作するのは、当たり前の話しですが、ポインタpDataを使っても、dataでのメンバーを操作可能です。
なお、どちらでも操作可能ならば、dataのほうは使わずに、

abc* pData = new abc; // ポインタpDataの宣言とインスタンス生成

としてもOKです。
なお、ポインタは難しいと言われていますが、それは実際に使う応用が難しいのであって、基本概念は、上記の通り、単なるアドレスのことです。
よって、詳しくはC又はC++の わかり易そうな入門書を読んで下さい。

話しを戻しますが、C++では、上記のオブジェクトdataでも、ポインタpDataでも、どちらでも操作可能で、両者を状況に応じて使い分けることが可能です。
しかし、C#では、ポインタはややこしいので、ポインタの技術仕様は無くしました。
そこで、オブジェクトdataと、ポインタpDataを合体させたような型を用意しました。
その型で、インスタンスを生成するには、

abc data = new abc(); // ポインタ該当のdataの宣言とインスタンス生成

とします。
このような型を参照型と言います。
すなわち、C#では、C++のポインタに該当する機能を持ったオブジェクトが用意されています。
よって、C#では、C++のように「アドレスがどうの」と考えなくても、ポインタに該当する機能が自動に処理される仕組みになっているのです。
なお、この参照型という仕組みは、C#だけではなく、VB.NETやJava等にも使われています。


クラスでのインスタンス生成が、質問のような書式になる理由が、なんとなくでも理解してもらえたでしょうか。




[参照型と値型]


C#で使える型は、参照型と値型に分類されます。
値型は、short、int、long、sbyte、ushort、uint、ulong、byte、float、double、decimal、char、bool、struct(構造体)等です。
参照型は、string、array(配列)、delegate、interface、class(クラス)等です。

値型は、インスタンス生成時にnewを使わず、参照型はnewを使って下さい。




[C#でのポインタの利用]


予断ですが、基本的にC#は、ポインタを使いませんが、VC♯.NETでは使うことも可能です。
詳しくは、以下参照。

http://msdn.microsoft.com/ja-jp/library/t2yzs44b.aspx

質問した人からのコメント

2009/11/11 06:03:41

前から型を指定するのにnewをつけるのとつけないのがある理由が疑問でしたが
とてもよく理解出来ました。ありがとうございました。

ベストアンサー以外の回答

1〜1件/1件中

lot********さん

2009/11/1020:34:51

分けて考えようじゃないか。


>クラス名 変数

これで、そのクラスとして変数を宣言できる。


>変数 = new クラス名()

これで、クラスのコンストラクタを呼び出してインスタンスを生成する。


>クラス名 変数 = new クラス名()

これは他の型の変数と同様、宣言時に初期化しているだけ。


new することでインスタンスを生成するのは構文上の決まり。





さて、問題点は整理できたかな?

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

せっかくの機会が台無しです

みんなのアンテナ

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる