0

次のコードを調べてください

public class ABC
{
    public ABC(int a)
    {
    }
}

public struct XYZ
{
    public XYZ(int a)
    {
    }
}

public class Test
{
    //This is invalid.
    ABC _abc = new ABC();

    //This is valid. Why?
    XYZ _xyz = new XYZ();
}

struct同じように必要な場合にデフォルトのコンストラクターを必要としないのはなぜclassですか?

4

3 に答える 3

2

クラス (参照型) の既定のコンストラクターは、明示的なコンストラクターが実装されていない (つまり、存在しない) 場合にのみ公開されるためです。new構造体 (値の型) は、いわば 'd にする必要さえありません。それなしで構造体を表す変数を使用できますnull

于 2013-08-29T12:22:07.897 に答える
1

クラス型の格納場所 (変数、フィールド、配列スロットなど) が最初に作成されたとき、それは保持されますnull。構造体型の格納場所が最初に作成されると、すべてのバイトがゼロに設定された型のインスタンスが保持されます。C++ とは異なり、.NET では、その型の格納場所がいつ作成されるか、また作成されたときに何が起こるかについて、その型が発言する手段がありません。

Fooがクラス型で、コードが array を作成する場合bar = new Foo[100]、配列は への参照を含まない 100 個のスロットで作成されFooます (最初は ですnull)。任意の配列スロットに a への参照を保持させたいコードFooは、どうにかして a への参照を取得する必要があり、への参照が存在する唯一の方法Fooは、誰かが (そのコンストラクターを呼び出して) クラスを作成するように要求した場合です。

対照的に、Mooが構造体型で、配列を作成するboz = new Moo[100]場合、配列は 100 個のスロットで作成され、それぞれインスタンスMooです。は のインスタンスを参照しないFoo値 ( ) を保持できますが、配列スロットはいずれもインスタンス以外のものを保持できません。の配列を作成すると、本質的に のインスタンスが作成され、型は問題に関与しないため、構造体型がインスタンスの作成を制御できるメカニズムは実際にはありません。nullFooMooMooMoo

于 2013-08-29T20:25:10.503 に答える