質問
これらのコンストラクターに違いがあるかどうかを把握しようとしています。引数を取らないFoo()コンストラクタがあると仮定すると、これらのコンストラクタはすべて同じ結果になりますか?
例1
public Foo()
: this()
{
blah;
blah;
blah;
}
例2
public Foo()
{
this();
blah;
blah;
blah;
}
例3
public Foo()
{
this = new Foo();
blah;
blah;
blah;
}
解決
- 例1は有効であり(パラメーターのないコンストラクターがある場合)、初期化の一部としてパラメーターのないコンストラクターを呼び出します。詳細については、コンストラクタチェーンに関する記事をご覧ください。編集:OPの編集以降、無限に再帰的であることに注意してください。
- 例2は決して有効ではありません
- 例3は、Fooが構造体である場合にのみ有効であり、有用なことは何もしません。
構造体の this
に割り当てるのは避けたいです。他の回答からわかるように、その非常に可能性はほとんど知られていません(仕様で明らかになった奇妙な状況のためだけに知っています)。あなたがそれを手に入れたところでは、それは何の役にも立ちません-そして、他の場所では、構造体を変異させる可能性がありますが、これは良い考えではありません。構造体は常に不変である必要があります:)
編集:人々を「平静に!」少し- this
に割り当てることは、メソッドで行うこともできるため、単に別のコンストラクターにチェーンすることとまったく同じではありません。
using System;
public struct Foo
{
// Readonly, so must be immutable, right?
public readonly string x;
public Foo(string x)
{
this.x = x;
}
public void EvilEvilEvil()
{
this = new Foo();
}
}
public class Test
{
static void Main()
{
Foo foo = new Foo("Test");
Console.WriteLine(foo.x); // Prints "Test"
foo.EvilEvilEvil();
Console.WriteLine(foo.x); // Prints nothing
}
}
他のヒント
例2と例3は正当なC#ではありません。
編集:Jonは、 Foo
が struct
である場合、3が有効であることを正確に指摘しています。彼の答えをチェックしてください!
いいえ、実際には最初のコンストラクタのみが有効であるため、そうではありません。他の2つはさまざまな理由で違法です。
編集興味深いことに、Fooが構造体の場合、3は実際に有効です。ただし、その場合でも、冗長な割り当てです。
所属していません StackOverflow