.NETでの値型表現の理解に問題があります。各値型はSystem.ValueTypeクラスから派生していますが、これは値型がクラスであることを意味しますか?
たとえば、私が書く場合:
int x = 5;
それは私がSystem.Int32
クラスのインスタンスを作成し、それを変数xに書き込むことを意味しますか?
.NETでの値型表現の理解に問題があります。各値型はSystem.ValueTypeクラスから派生していますが、これは値型がクラスであることを意味しますか?
たとえば、私が書く場合:
int x = 5;
それは私がSystem.Int32
クラスのインスタンスを作成し、それを変数xに書き込むことを意味しますか?
System.ValueTypeクラスは実際には単なる「メタ」クラスであり、内部的には通常のクラスとは異なる方法で処理されます。構造体とプリミティブ型は暗黙的にSystem.ValueTypeを継承しますが、その型は実行時に実際には存在しません。これは、クラスが値型構造体のように扱われ、値渡しのセマンティクスをとる必要があることをアセンブリがマークする方法にすぎません。
他の答えとは異なり、値型は常にスタックに割り当てられるとは限りません。それらがクラスのフィールドである場合、そのオブジェクトがインスタンス化されるときに、クラスデータの残りの部分と同じようにヒープ上に配置されます。ローカル変数は、イテレータまたはクロージャ内で使用される場合、暗黙のクラスに引き上げることもできます。
EricLippertの記事を参照してください。
つまり、値型は値によってコピーされます。値型は参照型と同じようにクラスであり、値型のインスタンスはオブジェクトです。5
オブジェクト、System.Int32
(int
略して)のインスタンスです。
さて、それについて話すことはたくさんあります。真剣に、ネット上にこのトピックについての何百ものページがあります、そしてそれのほとんどは驚くべき速度で私の脳の問題を燃やします。
私が実際に覚えているのは、intとInt32は同じものであり、どちらもクラスではなく構造体のように機能するということです。「int」はInt32へのショートカットです。(マウスをintの上に置くと、ツールチップに「structSystem.Int32」と表示されます。これは次のことを意味します。
public class BoxedInt
{
public int x;
public BoxedInt(int i) { x = i; }
}
public Test()
{
BoxedInt bi = new BoxedInt(10);
Boxed(bi);
Console.WriteLine(bi.x); // Returns 11, as any reference type would.
int vi = 10;
Valued(vi);
Console.WriteLine(vi); // Returns 10, because it acts like a struct. (Which it is)
}
public void Boxed(BoxedInt i)
{
i.x++;
}
public void Valued(int i)
{
i++;
}
値型はクラスではありません。これらは言語の組み込み型であり、.NET CTS(共通型システム)によって処理されます。CTSは、bool、int、double、floatなどの値型の処理を担当するCLR内のコンポーネントです。値型のオブジェクトを作成すると、スタック上に作成されます。それを関数に渡すか、関数から返すと、ramに新しいオブジェクトが作成されます。ただし、参照型の場合、オブジェクトの参照のみが渡され、新しいオブジェクトはメモリ内に作成されません。言語仕様に含まれておらず、ユーザーによって定義されているユーザー定義の値型がいくつかあります。このような値型は、System.ValueTypeから継承されます。このような値タイプの例は、複素数です。System.ValueTypeを使用して、独自のユーザー定義型の複素数を作成できます。