C # 구조체 new StructType () 대 default (StructType)
구조체가 있다고
public struct Foo
{
...
}
차이점이 있습니까?
Foo foo = new Foo();
과
Foo foo = default(Foo);
?
그들이 정확히 똑같다면 왜 똑같은 일을하는 두 가지 방법이 있는지 궁금 할 것입니다.
모든 참조 유형 또는 값 유형이 기본값을 갖도록 보장 되지만 모든 참조 유형에 매개 변수없는 생성자가 보장되는 것은 아니기 때문에 완전히 동일 하지는 않습니다.
static T MakeDefault<T>()
{
return default(T); // legal
// return new T(); // illegal
}
아니요, 두 식 모두 동일한 결과를 산출합니다.
구조체는 명시적인 매개 변수없는 생성자를 포함 할 수 없기 때문에 (즉, 직접 정의 할 수 없습니다) 기본 생성자는 모든 값이 0 인 구조체 버전을 제공합니다. 이것은 default
당신에게도 같은 행동입니다 .
값 유형의 경우 옵션은 실질적 으로 동일합니다.
그러나 나는 '지시'가 CIL에 지정되었을 때 구조체의 매개 변수없는 기본 생성자를 호출하는 '명령'에 대한 Jon Skeet의 경험적 연구 에 흥미를 느꼈 습니다. 무엇보다도, 그는 밖으로 시도했던 default(T)
및 new T()
위치를 T
유형 매개 변수입니다. 그들은 동등하게 보였습니다. 그들 중 누구도 생성자를 호출하는 것처럼 보이지 않았습니다.
그러나 그는이 시도하지 않은 사람의 경우는 (가 나타납니다)였다 default(Foo)
경우 Foo
실제 구조체 타입입니다.
그래서 저는 '해킹 된'구조체에 대한 그의 코드를 가져 와서 직접 시도했습니다.
default (Foo)는 생성자를 호출하지 않는 반면 new Foo ()는 실제로 호출합니다.
Oddity
매개 변수없는 생성자를 지정 하는 구조체 유형 사용 :
최적화가 해제 된 경우 방법은 다음과 같습니다.
private void CallDefault()
{
Oddity a = default(Oddity);
}
CIL ( nop
s, ret
s 등 없음)을 생성합니다 .
L_0001: ldloca.s a
L_0003: initobj [Oddity]Oddity
반면 방법 :
private void CallNew()
{
Oddity b = new Oddity();
}
생성 :
L_0001: ldloca.s b
L_0003: call instance void [Oddity]Oddity::.ctor()
최적화가 켜져으로 , 컴파일러는 멀리 꽤 많이 최적화 나타납니다 모두 의 CallDefault
노 조합으로 방법,하지만 유지 의 생성자 호출 CallNew
(잠재적 인 부작용에 대한을?).
언어 사양 (§4.1.2 및 §5.2)은 당신의 친구입니다. 구체적으로 특별히:
value-type 의 변수의 경우 기본값은 value-type 의 기본 생성자 (§4.1.2)에서 계산 된 값과 동일합니다 .
(원본의 이탤릭체)
이것은 참조 유형에 대해 동일하지 않습니다.
참조 유형 변수의 경우 기본값은
null
입니다.
이것은 기본 생성자가 생성 한 값 (존재하는 경우)과 확연히 다릅니다.
default
키워드는 정확한 유형을 모르고 구조체 (예 : 제네릭)에서만 작동 할 때 유용합니다.
T FirstOrDefault(IEnumerable<T> source)
{
if (...source is empty...) return default(T);
}
이것은 참조 유형의 경우 null을 반환하고, 기본 유형의 경우 기본값 (숫자의 경우 0, bool의 경우 false), 기본적으로 초기화 된 구조 등을 반환합니다.
컴파일 타임에 유형이 알려지면을 사용하는 것이 이치에 맞지 않으면 대신 default
사용할 수 있습니다.new Foo()
참조 URL : https://stackoverflow.com/questions/4974063/c-sharp-struct-new-structtype-vs-defaultstructtype
'programing' 카테고리의 다른 글
감사와 로깅의 차이점은 무엇입니까? (0) | 2021.01.18 |
---|---|
반복 가능한 객체 및 배열 유형 힌트? (0) | 2021.01.18 |
getElementById ()는 요소가 존재하더라도 null을 반환합니다. (0) | 2021.01.18 |
asp.net-mvc의 서버에서 텍스트 파일을 읽는 가장 좋은 방법은 무엇입니까? (0) | 2021.01.18 |
"for"문에서`! =`또는`<`를 사용해야합니까? (0) | 2021.01.18 |