Использование this () в конструкторах C # - PullRequest
10 голосов
/ 16 июня 2009

Я пытался выяснить, есть ли различия между этими конструкторами. Предполагая, что есть конструктор Foo (), который не принимает аргументов, все ли эти конструкторы будут иметь одинаковый результат?

Пример 1

public Foo()
    : this()
{
     blah;
     blah;
     blah;
}

Пример 2

public Foo()
{
     this();
     blah;
     blah;
     blah;
}

Пример 3

public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}

Ответы [ 3 ]

32 голосов
/ 16 июня 2009
  • Пример 1 действителен (при условии, что существует конструктор без параметров) и вызывает конструктор без параметров как часть инициализации. См. Мою статью о цепочке конструктора для более подробной информации. РЕДАКТИРОВАТЬ: Обратите внимание, что после редактирования ОП, он бесконечно рекурсивный.
  • Пример 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
    }
}
11 голосов
/ 16 июня 2009

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

РЕДАКТИРОВАТЬ: Джон точно указывает, что 3 является законным, когда Foo является struct. Иди проверь его ответ!

4 голосов
/ 16 июня 2009

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

РЕДАКТИРОВАТЬ Интересно, что 3 действительно допустимо, когда Foo является структурой. Но даже в этом случае это избыточное назначение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...