c# ポインタ代わりの配列 改定
こんにちは、c#初心者です。
先ほどの質問に回答がつかなかったので、内容が分かりにくいのだろうと思い改定しました。
汎用ライブラリを作っている途中で、引数にではなく、フィールドにポインタをもてたら良いのになと思う場面が時々あります。
「c#じゃ、クラスがポインタみたいなものだろ!」とおっしゃる方もいるかと思います。
Control c1 = new Control();
Control c2 = c1;
とすれば、確かにc1もc2も同じインスタンスを参照することになりますから、メンバ書き換えても当然もう一方も変わっていることになります。
しかし、問題は互いにスコープ上見えていないクラス同士で同じ値を持ちたい場合、具体的にはあるクラスAのインスタンス内にbとcがあり、bとcで同じ値を参照したい場合です。
class SampleClassA
{
SampleClassB b:
SampleClassC c:
}
上記のような構造で、b, cともにある方のメンバ変数「value」を持っていたとします。
そして、例えばvalueがクラスのstring型だったとすると、
string text = "テキスト";
b.value = text;
c.value = text;
とすれば同じ値を参照することになります。が、
b.value = "あいうえお"
とすると当然のことながらbのアドレスだけが変更され、cの値は変更されません。これをaの内部で行うのであれば、
b.value = "あいうえお";
c.value = b.value;
のようにすればいいわけですが、bやcの中で
value = "あいうえお";
としてしまうと完全にaもcも手も足も出ないわけです。
*value = "あいうえお";
が出来ないわけです。
何とかしようとすると、初心者は3つの方法を思いつきました。
1、イベントやデリゲート
2、SampleClassAに値を置いて、b, cからaを参照できるようにする。
1、ほとんど何でもでき、ある意味完璧ですが、消費メモリが増える上にデリゲートはパフォーマンス上ベストではない(ライブラリなので、別にAPIを作っているわけではないのですが)。
2、「スコープが大変混沌としてよろしくない」と初心者は思いました(多分あっていますよね?)。
3、それで、一度はこんなクラスを作りました。
public class Pointeric<T>
{
internal T _cont;
public T Containt
{
get { //略 }
set { //略 }
}
public SampleClass(T val) { //略 }
}
これでこのクラスのインスタンスを持っていれば
*b.value = "あいうえお"; の代わりに
b.value._cont = "あいうえお"; ができる。
また当然 c.value._cont は"あいうえお"になる
しかし、msdnさんのクラス ライブラリ開発のデザイン ガイドラインとやらに「ライブラリはpublicなフィールドを持っちゃダメ」と怒られたのでinternalに。すると同じソリューション(ライブラリ)でもプロジェクトが異なればプロパティを使わざるを得ません。すると速度が全然出ないわけです。
そこで代わりに長さ1の配列をポインタ代わりに使うという手を(最近)思いつきました。
具体的には
var _sharedValue = new Pointeric<int>(10);
------------------
_sharedValue.Containt = 5;
などとしていたのが、
var _sharedValue = new int[1] { 10 };
------------------
_sharedValue[0] = 5;
という形になります。
気になるのが「この配列はポインタ代わりに使われているんだな」ということにXMLコメントと名前だけで気づいてもらえるかどうかという事です。
まだ経験が浅いので判断しかねます。皆さんのご意見を伺わせてください。また、「こんな方法もあるよ」というのがあればお願いします。
お礼
回答有難うございます。 参照URLのおかげでなんとかアップロードはできそうです。 ただ、肝心の更新チェックはどうでしょうか?やはり難しいの でしょうか。。。