Использование этого() в конструкторах С#

Я пытаюсь выяснить, существуют ли какие-либо различия между этими конструкторами. Предполагая, что существует конструктор 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

  • Пример 1 действителен (если существует конструктор без параметров) и вызывает конструкцию без параметров в качестве части инициализации. Дополнительную информацию см. В статье статьи о цепочке конструкторов. EDIT: Обратите внимание, что, поскольку редактирование OP, оно бесконечно рекурсивно.
  • Пример 2 никогда не действителен
  • Пример 3 действителен только тогда, когда Foo является структурой и не делает ничего полезного.

Я бы избегал присваивания this в structs. Как вы можете видеть из других ответов, сама возможность этого довольно редко известна (я знаю только из-за какой-то странной ситуации, когда она появилась в спецификации). Там, где у вас это есть, это не приносит никакой пользы, и в других местах это, вероятно, будет мутировать структуру, что не очень хорошо. Структуры всегда должны быть неизменными:)

РЕДАКТИРОВАТЬ: Просто заставить людей "мять"! немного - присвоение 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

Примеры 2 и 3 не являются законными С#.

EDIT: Джон точно указывает, что 3 является законным, если Foo является struct. Пойдите, чтобы проверить его ответ!

Ответ 3

Нет, они не будут, потому что только первый конструктор действительно легален. Два других являются незаконными по разным причинам.

EDIT Интересно, что 3 действительно легально, когда Foo является структурой. Но даже в этом случае это избыточное задание.