続きネタ:「俺流インターフェイスの解釈」
元ネタ:「.Netはすごく難しいのかもしれない 」
おまんたせ致しました。
ふつーに考えたら意外に簡単でした。
まずはじめに、そもそも初心者にはアンボクシング・ボクシングって用語は教えませぬ。難しく感じちゃうから。
# ほら、Cでもポインター変数っていうだけで、まるで普通の変数とは全く別もんみたいに感じちゃうぢゃないですか。本当は普通の変数と構造上何ら変わりはないのに。
で、元ネタ抜粋
class Program {
public static void Main() {
Idata x, y;
x = new Val();
y = x;
((Val)x).setVal(123); // Val化して値変更
System.Console.WriteLine(
"Idata of Val: x={0}, y={1}", x.data, y.data);
}
}
結果はx,yともに0となります。
((Val)x).setVal(123); が機能してない(よに見えます)。
これはどう解釈すんだ?
interfaceを値型(struct)にcast-downするとコピーが返されるてことスカ?
まず、setがあるかどうかは今回の本質ではないので、加齢臭 カレーにする? 華麗にスルーで。(^^ゞ
問題はここの考え方。
((Val)x).setVal(123); // Val化して値変更
これは書き換えると以下のようになります。
Val v = (Val)x;
v.setVal(123); // Val化して値変更
つまり、Valにキャストした時点(値型になった時点)でコピーが生成されるわけです。
interfaceを値型(struct)にcast-downするとコピーが返されるてことスカ?
で、ビンゴです。
で、これは何も特殊なことと考える必要はなくって、値型のいたってふつーの動きです。
int x, y;
x = 0;
y = x;
int v;
v = x;
v = 123;
と同じことです。
値型に戻してから扱っているから、値型の動きを示しているのです。