C# 4.0의 "optional parameters"기능이 매우 흥미로웠다. 그래서 어떻게 만들어 졌는지 알아 내려고 노력했다. 그래서 나는이 같은 방법을 썼다 : 다음,MSIL에서 [opt]는 무엇을 의미합니까?
private static void A(int a = 5) { }
그것을 컴파일을 IL DASM 그것을 디 컴파일, 이는 IL 코드 :
.method private hidebysig static void A([opt] int32 a) cil managed
{
.param [1] = int32(0x00000005)
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::A
그리고 메타 데이터에서이 문제를 가지고있다 :
(1) ParamToken : (08000002)의 이름 : 플래그 : [선택 사항] [HasDefault] (00001010) 기본값 : (I4)가 5
그래서 내가 단서를 다음과 같은 방법을 썼다 :
private static void B([Optional, DefaultParameterValue(78)]int b) { }
컴파일하고 컴파일을 해본 결과, C# 컴파일러가 A와 B (이름 제외)와 거의 동일한 MSIL 코드를 생성한다는 것을 알게되었습니다.
우리는 거기에 IL 코드의 속성의 흔적이없고 잘못 생각, 그래서 이런 사용자 지정 특성 썼다 볼 수 있듯이 : 다음
[AttributeUsage(AttributeTargets.Parameter)]
public class MyTestAttribute : Attribute
{
}
을이 같은 방법 C에서 그것을 사용 :
를private static void C([MyTest]int c) { }
그것을 컴파일 한 후 디 컴파일을하고, HAH,이 발견 :
.method private hidebysig static void C(int32 c) cil managed
{
.param [1]
.custom instance void ConsoleApplication1.MyTestAttribute::.ctor() = (01 00 00 00)
// Code size 2 (0x2)
.maxstack 8
IL_0000: nop
IL_0001: ret
} // end of method Program::C
의 두 번째 줄 메서드 본문 내 사용자 지정 속성의 ctor를 호출합니다.
그래서이 내 의심에 이르게 :- [옵트] 무엇을 의미합니까? 나는 방법 A와 B의 매개 변수 앞에 나타나는 것을 의미합니다.
- 메서드 C가 해당 매개 변수에 적용되는 특성의 생성자를 어떻게 호출하고 A와 B 메서드는 그렇지 않습니까?
- 메타 데이터에서 DefaultParameterValueAttribute의 기호를 찾을 수없는 것 같지만 OptionalAttribute 및 MyTestAttribute를 찾을 수 있습니다. 왜 그런가요? 제가 누락 된 것이 있습니까?
미리 감사드립니다.
고마워, 나는 그렇게 빨리 답변을 기대하지 않았다. 하지만 당신 것 같아요. – CuiPengFei
그리고 나는 opt가 최적화를 의미한다고 생각해 왔습니다 ... – CuiPengFei
와우, CSC 버그를 찾으려고하지 않았습니다. – CuiPengFei