3
using System;

namespace FirstApplication
{
    class Program
    {
        static void Main(params string[] args)
        {
            int x = new int();
            x = 12;
            //int y = new int(12);
            Console.WriteLine(x);
        }
    }
}

設計上、最初に0に設定しなくても、12に設定できる単一のパラメーターctorintがないのはなぜですか?x

4

3 に答える 3

7

その理由はCLR自体にあります。Int32CLRは、通常の構造体としては扱われません。を格納するための特別なタイプがintありますが、これはCLRオブジェクトではありません。intこれは、Cのにコンストラクターがないのと同じように、コンストラクターを必要としないことを意味します。

また、struct default contructorsのCLR処理では、すべてのフィールドをデフォルト値に設定します。intの場合、これは0です。これはnew int()特殊なケースのようです。単に0の「エイリアス」であり、コンストラクターを完全に排除します。

さらに、これは明らかに優れています。

int x = 12;
于 2012-06-22T11:28:04.657 に答える
5

それは不要です-私は大いに好みます:

int x = 12;

int x = new int(12);

であるため、パラメーターなしのコンストラクターが提供されてintstructます。実際に明示的に使用する実動コードは見たことがありません。

于 2012-06-22T11:26:28.447 に答える
1

仕様では必要ありません

構造体は、パラメーターを持つインスタンスコンストラクターを宣言できます。

必須ではありませ ; したがって、パラメーターを受け取るコンストラクターの提供は完全にオプションです。デザイナーはそうしないことを選んだので、彼らにより多くの力があります;-)

他にどのような理由がありますか?

設計の簡素化?

フレームワークの設計者がコンストラクターを提供することを決定したことを少し想像してみましょう。

int myInt = new int(99999999999999999999999999999999999);

コンストラクターの複雑さが増しました。オーバーフローエラーを回避するには、指定された値の範囲を確認する必要があります。

したがって、単純化はコンストラクターを提供することに反対する議論でもあります。

この仕様では、「 simple-types 」のデフォルト値も定義されています。intの場合、0です。@KendallFreyが言及しているように、intのインスタンス化のための最適化がある可能性がありますが、それらには確かコンストラクターがあります-値を0に初期化する暗黙のデフォルトのものです。IIRC(そして私がそれを掘ることができるかどうかを確認します後で)、単純型は実際にはメモリマネージャによってインスタンス化されます。ここに追加のコンストラクタロジックも問題を複雑にする可能性があります。

セマンティクスを実施しますか?

@ rich.okellyが言及しているように、int x = 12; ちょうどよく見えます。これは、値型のセマンティクスが値の直接割り当てを含むことを理解していることが多いためです。私の場合、参照型の代入var x = new RefType(); 割り当てと割り当てには異なるプロセスが発生していると常に推測してきました。初心者ユーザーは次のことを期待するかもしれません:

int x = new int(12);

XmlDocument x = new XmlDocument();

何らかの形で同等であるために。

ノート:

これがフレームワークにこれを実装した人以外の誰もが答えることができる質問だとは本当に信じていません。

于 2012-06-22T16:05:09.717 に答える