문제

이 생성자 사이에 차이가 있는지 알아 내려고 노력했습니다. 인수가없는 foo () 생성자가 있다고 가정하면,이 생성자는 모두 같은 결과를 얻을 수 있습니까?

예 1

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

예 2

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

예 3

public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}
도움이 되었습니까?

해결책

  • 예 1은 유효하며 (매개 변수가없는 생성자가 있다고 가정) 초기화의 일부로 매개 변수없는 생성자를 호출합니다. 내 참조 생성자 체인에 관한 기사 자세한 사항은. 편집 : OP의 편집 이후 무한히 재귀 적입니다.
  • 예제 2는 유효하지 않습니다
  • 예 3은 foo가 구조물 일 때만 유효하며 유용한 일을하지 않습니다.

나는 할당을 피할 것입니다 this 구조에서. 다른 답변에서 볼 수 있듯이 가능성 그것은 상당히 거의 알려져 있지 않습니다 (나는 사양에서 나타나는 이상한 상황 때문에만 알고 있습니다). 당신이 그것을 가진 곳에서는 좋은 일을하지 않습니다. 그리고 다른 곳에서는 구조물을 돌릴 수 있습니다. ~ 아니다 좋은 아이디어. 구조는 항상 불변이어야합니다 :)

편집 : 사람들이 "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
    }
}

다른 팁

예 2와 3은 합법적 인 C#이 아닙니다.

편집 : Jon은 3이 합법적이라고 정확하게 지적합니다. Foo a struct. 그의 대답을 확인하십시오!

첫 번째 생성자 만 실제로 합법적이기 때문에 그들은 아닙니다. 다른 두 가지는 여러 가지 이유로 불법입니다.

편집하다 흥미롭고, 3은 Foo가 구조물 일 때 실제로 합법적입니다. 그러나이 경우에도 중복 과제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top