質問

これらのコンストラクターに違いがあるかどうかを把握しようとしています。引数を取らない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は実際に有効です。ただし、その場合でも、冗長な割り当てです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top