主な質問は、有用性とメモリに関して、このキーワードを変更できるようにすることの意味は何ですか。そして、なぜこれがC#言語仕様で許可されているのですか?
他の質問/サブパートは、そうすることを選択した場合、答えられるかどうかはわかりません。それらへの回答は、主要な質問への回答を明確にするのに役立つと思いました。
私はあなたがC#または.NETで見た中で最も奇妙なコーナーケースは何ですか?への答えとしてこれに出くわしました。
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
私は、C#言語仕様でこれが許可される理由に頭を悩ませようとしてきました。 サブパート1。これを変更可能にすることを正当化するものはありますか?それはすべて役に立ちますか?
その答えに対するコメントの1つは
CLRからC#経由:これを作成した理由は、別のコンストラクターで構造体のパラメーターなしのコンストラクターを呼び出すことができるためです。構造体の1つの値のみを初期化し、他の値をゼロ/ null(デフォルト)にしたい場合は、public Foo(int bar){this = new Foo();と書くことができます。specialVar=bar;}。これは効率的ではなく、実際には正当化されません(specialVarは2回割り当てられます)が、参考までに。(それが本に記載されている理由です。なぜ私たちは公開Foo(int bar)を行うべきではないのかわかりません:this())
サブパート2。 私はその推論に従うかどうかわかりません。誰かが彼の意味を明確にすることができますか?多分それがどのように使われるかについての具体的な例?
編集(スタックまたはヒープの主なポイントは、メモリの解放またはガベージコレクションに関するものです。int[]の代わりに、262144のパブリックintフィールドに置き換えることができます)また、私の理解では、構造体はヒープではなくスタックに作成されます。この構造体では、1Mbバイトの配列フィールドが次のように初期化されます。
public int[] Mb = new int[262144];
サブパート3.Fooが呼び出されたときに、これがスタックから削除されることはありますか?私には、構造体がスコープから外れることはなかったので、スタックから削除されないようです。今夜はテストケースを作成する時間がありませんが、明日はテストケースを作成するかもしれません。
以下のコードでは
Teaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
サブパート4。t1とtPlaceHolderは同じまたは異なるアドレス空間を占めていますか?
3年前の投稿を表示して申し訳ありませんが、これは本当に頭を悩ませています。
参考までに、stackoverflowに関する最初の質問です。質問に問題があった場合は、コメントを投稿して編集します。
2日後、質問を説明するために答えにはかなりの量の作業が必要になると思うので、すでに勝者が頭に浮かんだとしても、この質問に50の賞金をかけます。