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

10

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

Example 1
<code>public Foo()
    : this()
{
     blah;
     blah;
     blah;
}
</code>
Example 2
<code>public Foo()
{
     this();
     blah;
     blah;
     blah;
}
</code>
Example 3
<code>public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}
</code>
+1 научил меня чему-то новому с примером № 3 и тем фактом, что J S всегда скрывается Gishu

Ваш Ответ

3   ответа
11

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

Error: User Rate Limit Exceededstruct Foo { int a; Foo(Foo other) { this=other; } }
4

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

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

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
    }
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Tim
Error: User Rate Limit Exceeded Tim
Error: User Rate Limit Exceededmsdn.microsoft.com/en-us/library/ms173115.aspx

Похожие вопросы