2018.02/24 プログラミング(16)
型には、値型(Value Type)と参照型(Reference Type)がある。値型とは、値が直接管理されているデータ型であり、値型を宣言、すなわちプログラム中で定義するとその型のデータ領域がメモリー上に確保され、この確保された領域を直接プログラマーが操作することができる。
参照型とは、値への参照、すなわちデータ領域を示したある媒介変数を介して間接的にデータを管理する型である。C言語ではポインターがこの役割をしていたが、C#ではポインターを意識せずデータ型で参照型が決められている。
値型では直接データをアクセスできるが、参照型ではデータ領域を示したメモリー上のアドレスを介してデータにアクセスするので、それらの振る舞いは異なる。
すなわち値型では、直接データの変更が可能で変更されたデータは変更されたときの値になるが、参照型ではそのようにならないことがあるので、コーディングで注意しなければいけない。
例えば、 int x=1; int y=x; y=501; とコーディングした時に、xは1のままであるし、yは501と変化する。これは変数が整数を表すように型づけする int という宣言が値型であるからだ。
一方、class Ref_rei { interanal int value;} Ref_rei X=new Ref_rei(); X.value=1; Ref_rei Y=X ; Y.value=501; では、X.valueも501になる。これは、Y=Xで、メモリー上のアドレスをYにセットしており、X.value もY.value も同じメモリ上に存在するからだ。
この値型と参照型について慣れないうちは頭が混乱するが、値型がメモリー上の値と変数の値が直接結びついており、参照型の変数では単に実体が存在するメモリー上の位置を示すアドレスがセットされている、という感覚を身に着けると普通にプログラムコードを読み解くことが可能となる。
以前書いたように、プログラム言語の文法はコンピューターという機械を相手にした文法である。文法の仕様には機械に配慮した手続きが組み込まれてくる。この値型と参照型はメモリーの使い方に関する工夫であり、その仕組みからプログラムの実行スピードに影響を与える。
MS-DOSの時代には、このプログラムの実行スピードがプログラマーの腕にかかっていた。パーコレーション転移シミュレーションプログラムでは、アルゴリズムの少しの違いとポインターの使用でプログラムの実行スピードが二倍ほど変化した。しかし、いまやメモリーもG単位であり、CPUの演算速度は当時と比較すれば亀とウサギよりも蝸牛とウサギほどの違いがあり、多少ずぼらなコーディングでも許され、むしろプログラムの分かりやすさ、可読性が重視されている。
カテゴリー : 一般
pagetop