10

Вопрос по c#, constructor – Использование this () в конструкторах C #

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

Example 1

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

Example 2

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

Example 3

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

+1 научил меня чему-то новому с примером № 3 и тем фактом, что J S всегда скрывается

Jun 16, 2009, 2:24 PMот

3ответа

32

  • Example 1 is valid (assuming there is a parameterless constructor), and calls the parameterless constructor as part of initialization. See my article on constructor chaining for more details. EDIT: Note that since the OP's edit, it's infinitely recursive.
  • Example 2 is never valid
  • Example 3 is only valid when Foo is a struct, and doesn't do anything useful.

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

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

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

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

4

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

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

RelatedQuestions