.NET에서 값 유형 (C # struct
)은 매개 변수가없는 생성자를 가질 수 없습니다. 이 게시물 에 따르면 이것은 CLI 사양에 의해 요구됩니다. 모든 값 유형에 대해 기본 생성자가 (컴파일러에 의해) 생성되어 모든 멤버를 0으로 초기화합니다 (또는 null
).
이러한 기본 생성자를 정의 할 수없는 이유는 무엇입니까?
한 가지 사소한 용도는 유리수입니다.
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
현재 버전의 C #을 사용하면 기본 Rational이 0/0
그리 좋지 않습니다.
추신 : 기본 매개 변수가 C # 4.0 에서이 문제를 해결하는 데 도움이됩니까? 또는 CLR 정의 기본 생성자가 호출됩니까?
Jon Skeet 가 대답했습니다.
당신의 모범을 사용하기 위해 누군가가했을 때 어떤 일이 일어나고 싶습니까?
Rational[] fractions = new Rational[1000];
생성자를 1000 번 실행해야합니까?
물론, 이것이 기본 생성자를 처음에 쓴 이유입니다. 명시 적 기본 생성자가 정의되지 않은 경우 CLR은 기본 제로 생성자를 사용해야합니다 . 그렇게하면 사용한만큼만 지불합니다. 그런 다음 기본이 아닌 1000 개의 컨테이너를 Rational
원하고 1000 구성을 최적화하려는 List<Rational>
경우 배열 대신 오히려 사용합니다 .
내 생각에이 이유는 기본 생성자의 정의를 막기에 충분하지 않다.
Rational()
않고 매개 변수가없는 ctor를 호출 하기 때문에 도움이되지 않습니다 Rational(long num=0, long denom=1)
.
new Rational()
존재하는 경우 존재하지 않는 그러나 경우, 생성자를 호출 new Rational()
에 해당 될 것입니다 default(Rational)
. 어쨌든 default(Rational)
구조체의 "제로 값"(원하는 디자인의 "나쁜"숫자)을 원할 때 구문을 사용하는 것이 좋습니다 Rational
. 값 유형의 기본값 T
은 항상 default(T)
입니다. 따라서 new Rational[1000]
구조체 생성자를 호출하지 않습니다.
denominator - 1
구조체 안에 저장할 수 있습니다 . 기본값은 0/1이됩니다
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.
왜 배열이 구조체의 List에 대해 다른 생성자를 호출해야합니까?