- Пример 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
}
}