2013年12月6日金曜日

C#で定数の配列

C#でconstを付けた配列は初期化することができません

この例の場合
constを使用したint配列のConstantList2は
"'ConstantList2' の型は 'int[]' です。文字列以外の参照型の const フィールドは null でのみ初期化できます。"
というようなエラーが発生します

しかしConstantList1はreadonlyを使っているため初期化することができます
readonlyを使用した場合、特定の条件を除き変更することはできません
そのため擬似的にconst型として使えます


readonlyは特定条件下で変更することができ、それはコンストラクタの中です
例えば上記のように宣言と同時に初期化しても、コンストラクタの中で
ConstantList1 = new int[10];
ConstantList1[0] = 10;
ConstantList1[1] = 20;
...
のようにすれば内容を変更することができます
これは一見便利なように見えますが、コンストラクタ内でreadonlyの変数を使った場合、中身を書き換える気がなくても書き換えてしまう可能性があるということです
この問題を回避する方法についてですが、一番危険な方法は「変数を書き換えないように努力する」ことでしょう
しかしそれでは意味が無いので別の方法を探す必要があります
一番簡単な方法は、例えばFunctionsというクラスがある場合、_Functionsのような関数を作り、コンストラクタFunctions内では_Functionsを呼び出すにとどめ、コンストラクタを使った初期化は_Functions関数内で行う という方法があります
この場合一手間余計に必要なのと、関数を1個呼び出すためのオーバーヘッドが必要になってしまうという問題が有ります
しかし一旦関数を呼び出して、コンストラクタの外側に出てしまえばreadonlyの変数を変更することはできないため、一応効果はあります


いくつかの利点や欠点がありますが、readonlyを使えば変数の定数配列を使うことができるので、状況によってはうまく使うと便利かもしれません

0 件のコメント:

コメントを投稿