最近のお仕事はC#で作っています。
何でこんなことになったのかは分かりませんが、まぁそういうことです。
で、これ
C++的にも、データ宣言をするときはnewを使ったりすることもありましたが、この場合はdeleteで必ず削除する必要が有りました。
実はあたし、new xxx[xx];で宣言したのはdelete [] xxx;で削除しなければいけないのをかなり長い間知りませんでした(笑
まぁそんなこともあり、c++にどっぷり感が出てきたあたしは、メモリの確保と、解放はかなり神経質になっていました。
しかしC#の一番はじめの挫折はdeleteが無いことでしたw
そんなことも乗り越え、そろそろ1ヶ月です?
あれもこれも、C#でできる方法がないかかなり探し回る日々でした。
で、ずっとぶち当たっていた問題の結果がこれ
c++というか・・・c的には
int a[10]={0,1,2,3,4,5,6,7,8,9};
で宣言すれば十分的な
いえね、配列を宣言するという意味合いじゃないんですよ。
静的データの宣言なのです。
アプリケーションには何をするにも、いろいろ初期値という物があります。
この初期値が正しく設定されていないと、思わぬ不具合が発生したり、動作が定まらなかったり大変なのです。
固定的に値を宣言しておけばそれで十分的な何かを、C#ではなかなかそうは行かなかったのです。
なぜかって??
それは、deleteが無いことに全ては起因しています。
ガベージコレクタが、自動的にメモリを整理してしまう構造のC#では、静的データでさえ、初期値込みのデータとして宣言することができないのです。
これは、調べ尽くした結果(というほどでもない)
staticのクラスを宣言し、staticで配列変数を宣言して、コンストラクタで配列をnewで初期値込みで割り当てる必要が有るみたいです?
まぁもしかしたらconst を宣言すれば、もうちょっと何かが変えられるかもしれませんが、でも静的クラスについての説明を読むと、
new等無しにクラスにアクセスができるようになり、該当メソッド、値等は必要になる前に自動的に初期化されて(コンストラクタが呼び出される)使用可能になり、それ以降は、固定的にメモリマッピングされ、他のDLLから呼び出す場合でも、無駄な初期化行為は全く行われない。
参照設定さえしておけば、どこからでも自由に読み書きができるわけです。
また、おもしろいことに初期化タイミング自体を設定することも不可能とか、それはそれでおもしろいと思いましたがw
breakを掛けてみると、一番はじめに値を参照するときに、コンストラクタが呼ばれました。
まぁこれは”たまたま”で、有ると同時に、必然でもありますね。
ちなみに
classにstatic 属性をつければそれでOK
配列を宣言するときは、コンストラクタにて正しく初期化しましょうね☆
コンストラクタで初期化していない物については、それ以降全く初期化が行われないために、値が不定になるんじゃないかな?C#的にはexceptionが発生するんじゃないかしら?
そのあたりも、テストしてみるとおもしろいかもしれません?? |