第2回 5.値型と参照型

C又はC++なんかを少しでも齧った人ならば、リテラルとか変数とかキャストの説明とか
されても全然うれしくないと思います(分かりきってることですからね)
と、いうわけで、C#での型についてもう一歩踏み込んで説明したいと思います。
C#での型は大きく分けて二つあります。
一つが値型、もう一つは参照型です。
変数、として説明されているもののうち、「string」は参照型で、それ以外は値型、に
なります。
じゃぁ、値型と参照型ってなにがちがうの?
という質問が当然出てくると思いますが、簡単に言うと、値型はオブジェクトを渡す際
(例えば、関数のパラメータとして渡す際)、データをコピーするもの、参照型はオブ
ジェクトのアドレスを渡すもの、ということになります。
このデータが、例えば1MByteもあるような強大なデータだった場合、値型ならば渡すた
びにコピーを行う為、オーバーヘッドが大きくなります。
参照型ならば、アドレスを渡せば良いので、オーバーヘッドを気にする必要はありません。
プログラムを作成する際、効率を重視するならこのオーバーへッドを念頭に入れて値型と
参照型を使い分ける必要があります。
ま、この辺はCやC++でもありましたね。
特にC++では参照渡しもできましたし。
さて、ここからが重要、というかC#特有なものになるのですが、C#では構造体は値型、ク
ラスは参照型になります。
C#での構造体はstructですが、C/C++でのstructと意味合いが異なります。
詳細をここで説明することはしませんが、一番大きな違いは、C#の構造体は「System.Val
ueType」を継承し、System.ValuteTypeは「System.Object」を継承しています。
よって、System.ValuteTypeと、System.Objectのメソッドを使用することが出来ます。
メソッドというのは、構造体やクラスの持つ関数のことです。
Systemは名前空間です。
Systemという名前空間の下に、いくつか構造体やクラスがあり、ValuteTypeとObjectはSys
temの下にあるクラスです。
ちなみに、変数の型として説明したintやbyteなども、実はSystemの下にある構造体だった
りします。
これらは単なる予約語で、たとえばSystem.Int32等という表記も出来ます。
予約語と、System下の構造体/クラス名前との対応は以下の通り。

予約語 System
byte System.Byte
sbyte System.SByte
ushort System.UInt16
short System.Int16
uint System.UInt32
int System.Int32
ulong System.UInt64
long System.Int64
float System.Single
double System.Double
decimal System.Decimal
char System.Char
string System.String
bool System.Boolean
object System.Object

実際に動かしてみましょう。
例えば、変数intは参照型、つまり構造体です。
構造体なので、Sytem.ValuteTypeとSystem.Objectのメソッドを使用することが出来ま
す。

Hellow Worldでやったように、新規にプロジェクトを作ってみましょう。
真ん中にlabelを設置します。
そして、Form1_Load関数を以下のようにします。
 int i = 1234;
 label1.Text = i.ToString();
ToStringは、System.Objectのメソッドです。
実行させると、真ん中に1234と表示されるウィンドウが表示されるはずです。
labelへ値を渡すとき、直接「label1.Text = i;」のようにすると、型が違うぞと怒ら
れます。
Label::Textはstring型です。
int型を代入することは出来ません。
なので、ToString()メソッドで、数値を文字列に変換し、格納しているわけです。

説明文を書いていてなんですが、実のところこの辺に対する知識は必須のものではあり
ません。
知らなくても簡単なプログラム、例えばコンバータ等は作ることが出来ます。
ただ、知っておくに越したことはありませんし、有る程度高度なプログラムを作るよう
になると、このあたりの知識量がものを言うようになってきます。
なので、初めのほうはint型をstring型に入れるにはToString()を使えばいいんだ、程
度で覚えていてもかまいませんが、C#でプログラムを有る程度作れるようになったら、
改めてこの説明を見てみると良いかもしれません。
最終更新:2007年09月06日 12:55
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。