参照


DESC 1. 変数は参照であり, 未初期化の変数は CMPERR になる.


値型と参照型 ( struct は 値型 class は参照型 )


System.Int32などを紹介してきたが、あえてクラスとは呼んでいなかった。 これは「Structs」と呼ばれるもの Structsは、Structsからの継承ができないなどの制約を除けば見かけ上クラスにそっくり POINT C#でのStructsとクラスの違いは それが値型なのか、参照型なのかという機能面での違い C#のstructは、C/C++ のstructとはまったくの別物 値型とは 情報を引き渡すときに情報をコピーする方式を取るデータ型 参照型とは データの実体がある場所を保存しておき 情報を引き渡す必要がある場合は データの本体をコピーせずデータの場所だけを伝えるという方式 この2つは、動作も微妙に違うが、それ以上に大きく違うのは、処理効率である 小さなデータなら問題ないのだが 大きなデータでは処理速度の低下という問題を招く 逆にデータが十分に小さいとすると、データの場所を渡すと言うような回りくどい方法を取るよりも データそのものをコピーする方が素早い、と言うこともある 主にデータ量という観点で使い分けること
using System; public class Test { public int v; } public class Class1 { public static int Main(string[] args) { // 時間を表示する. Console.WriteLine( DateTime.Now ); int count = 10000000; // 1000 万の Instance をつくる. Test [] test = new Test[count]; for( int i=0; i<count; i++ ) { test[i] = new Test(); test[i].v = i; } int sum = 0; for( int i=0; i<count; i++ ) { sum += test[i].v; } Console.WriteLine( DateTime.Now ); return 0; } }
具体的には、整数型変数を1つ含むクラスを宣言し、 このクラスを要素とする1000万個の配列を作って、要素番号を変数に代入する。 その後、全要素のクラス変数の値を加算していく。 5: int型変数を1つ含むTestクラスの宣言。 13: 「DateTime.Now」は現在時刻を返す。 プログラムが実行を開始されたら、まずはこのプロパティを表示し、処理を開始する直前の時刻を表記する。 14: 今回宣言する配列の要素数を保持する変数。今回は1000万とした。 15: 1000万個の要素を持つTestクラスの配列を作成し、変数「test」に代入する。 16〜20: test配列の各要素となるTestクラスを作成し、そのインスタンス変数「v」にカウンタの値を代入する。 21: 計算処理に使用する整数型変数。ただし今回は計算処理の実行性能を調べるのが目的なので、計算の内容自体には意味はない。 22〜25: test配列の各要素であるTestオブジェクトのv変数の値を次々と加算し、結果を変数「sum」に代入していく。 26: 処理終了の時刻を表示する。 POINT 13行目と26行目の DateTime.Now は、現在時刻を返すプロパティである。 これを使って、処理前と処理後の時刻を表示させ
{ using System; // struct を利用する. public struct Test { public int v; } public class Class1 { public static int Main(string[] args) { Console.WriteLine( DateTime.Now ); int count = 10000000; Test [] test = new Test[count]; // ここで巨大な Block を確保している. for( int i=0; i<count; i++ ) { // struct ならば, ここも不要. test[i] = new Test(); test[i].v = i; } int sum = 0; for( int i=0; i<count; i++ ) { sum += test[i].v; } Console.WriteLine( DateTime.Now ); return 0; } } }
class // クラスの場合、1個のインスタンスは、1つの独立したメモリ領域として確保される。 [ ref ] --> [ Instance ] [ ref ] [ ref ] Struct [ Instance ] [ Instance ] [ Instance ] クラスとStructsでの確保されるメモリ領域の違い クラスを用いた場合には(図[上]) 各インスタンスごとに独立したメモリ領域が確保され 値が格納される 配列の各要素はそれぞれのメモリ領域への参照を保持する Structsを用いた場合 配列を作成した時点で、要素数分のStructsを納めるための巨大なメモリ領域が確保され その中に値が格納される 反面、Structsの利用は危険も伴う。Structsは、制限の厳しいクラスのようなものだが、 クラスそのものではない。 クラスと思い込んで扱ってしまうと、思わぬトラブルが起きる場合もある。 例えば、巨大なStructsを作成してしまうと、Structsは値型なので、別の変数に代入する場合などには、 丸ごと中身をコピーする羽目になり、処理効率を著しく落とす。 Structsはツボにはまれば効率アップできるが、 一歩間違えると処理効率を大きく下げかねない危険がある。