문제
이 생성자 사이에 차이가 있는지 알아 내려고 노력했습니다. 인수가없는 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가 구조물 일 때 실제로 합법적입니다. 그러나이 경우에도 중복 과제입니다.
제휴하지 않습니다 StackOverflow