主な質問は、有用性と記憶に関してこのキーワードを変更できるようにすることの意味ですか?なぜC#言語仕様でこれが許可されていますか?C#でこのキーワードを割り当てます
その他の質問/サブパートに回答することも、そうしないようにすることもできます。私は彼らの答えが主な質問に対する答えを明確にするのに役立つだろうと思った。
私はC#言語仕様もこれを許可する理由のまわりで私の頭をラップしようとしてきたWhat's the strangest corner case you've seen in C# or .NET?
public struct Teaser
{
public void Foo()
{
this = new Teaser();
}
}
への答えとしてこれに出くわしました。 サブ部1。 このは変更可能ですか?それはすべて役に立ちますか?
その答えへのコメントの一つは、C#を経由してCLRから
た:あなたは は別の コンストラクタで構造体のパラメータなしのコンストラクタを呼び出すことができますので、彼らはこれを作った理由があります。構造体の1つの値だけを初期化したい場合は、 は他の値をゼロ/ null(デフォルト)にしたい場合は、publicと書くことができます。 Foo(int bar){this = new Foo(); specialVar = bar;}これは ではなく、実際には正当化されていません(specialVarは2回割り当てられています)が、FYIのちょうど です。私はいないよ
サブ部2:(この()なぜ我々 だけでやるべきではない公共のFoo(int型バー)それは本の中で与えられた理由です、私は知りません)確かに私はその推論に従う。誰かが彼の意味を明確にすることはできますか?多分それがどのように使用されるのかの具体例がありますか?
EDIT(メモリの解放またはガベージコレクションに関しては、スタックまたはヒープのメインポイントは無視されます。int []ではなく、262144のpublic intフィールドで置き換えることができます) また、私の理解から、構造体はこの構造体はそう
public int[] Mb = new int[262144];
サブ部3として初期化1 Mbのバイト配列フィールドを持っていた場合は、ヒープではなく、このfooが呼び出されたときに、これまでスタックから削除されますでしょうか?私にとっては、構造体がスコープ外に出ることはないので、スタックからは削除されません。今夜はテストケースを作成する時間がありませんが、多分私は明日このためにします。
以下のコードでTeaser t1 = new Teaser();
Teaser tPlaceHolder = t1;
t1.Foo();
サブ部4。 t1とtPlaceHolderは同じアドレス空間または異なるアドレス空間を占有していますか?
3歳のポストを持ち上げて申し訳ありませんが、これは本当に私の頭が傷ついています。
FYIの最初の質問stackoverflowだから私は質問に間違って何かを得た場合親切にコメントを投稿し、私は編集します。
2日後、この質問に50の賞金を払うつもりです。私の考えで勝者を選んだとしても、回答には質問を説明するのに妥当な量の作業が必要になると思います。
4つの質問がスタックオーバーフローに適していません。 * –
@AnthonyPegram - このケースでは、これらの質問は構造体が実際にどのように動作するのかという主要な質問に対する副題であるため、受け入れられると思います。 – Polity
私は、すべてを1つにまとめる方法がわかりません。私が主張する主な質問は、このキーワードが変更されるのを許すという側面に何が影響しているかによってまとめられます。質問3-4は私が考えられる副作用です。誰かが私のほかに質問を編集する力を持っていて、彼らがそれをもっとよく聞くことができると思うなら、それを自由にしてください。または、より良い質問を示唆するコメントを残して、最初から始めます。 –