Ответ 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
}
}