C# Language
C # 4.0 기능
수색…
선택적 매개 변수 및 명명 된 인수
인수가 선택적 인수 인 경우 호출에서 인수를 생략 할 수 있습니다. 모든 선택적 인수는 고유 한 기본값을가집니다. 값을 제공하지 않으면 기본값을 사용합니다. 선택적 인수의 기본값은 a
- 상수 표현.
- enum 또는 struct와 같은 값 유형이어야합니다.
- 형식 default (valueType)의 표현식이어야합니다.
매개 변수 목록의 끝에서 설정해야합니다.
기본값이있는 메소드 매개 변수 :
public void ExampleMethod(int required, string optValue = "test", int optNum = 42)
{
//...
}
MSDN이 말했듯이,
매개 변수의 이름을 연관시켜 인수를 함수에 전달할 수 있습니다. 우리가 항상 알고 있지 않은 매개 변수 위치를 기억할 필요는 없습니다. 호출 된 함수의 매개 변수 목록에서 매개 변수의 순서를 볼 필요가 없습니다. 이름별로 각 인수에 대한 매개 변수를 지정할 수 있습니다.
명명 된 인수 :
// required = 3, optValue = "test", optNum = 4
ExampleMethod(3, optNum: 4);
// required = 2, optValue = "foo", optNum = 42
ExampleMethod(2, optValue: "foo");
// required = 6, optValue = "bar", optNum = 1
ExampleMethod(optNum: 1, optValue: "bar", required: 6);
명명 된 인수 사용 제한
고정 인수가 지정되면 명명 된 인수 스펙이 나타나야합니다.
고정 인수 앞에 이름 지정된 인수를 사용하면 다음과 같이 컴파일 시간 오류가 발생합니다.
모든 고정 인수가 지정된 후에는 명명 된 인수 스펙이 나타나야합니다.
변화
일반 인터페이스와 델리게이트는 각각 out
및 in
키워드를 사용하여 유형 매개 변수를 공 변 ( covariant) 또는 반 차체 (contravariant) 로 표시 할 수 있습니다. 이러한 선언은 암시 적 및 명시 적 유형 변환, 컴파일 시간 및 런타임 모두에 대해 존중됩니다.
예를 들어, 기존 인터페이스 IEnumerable<T>
이 공변수로 재정의되었습니다.
interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
기존 인터페이스 IComparer는 반공 변성으로 재정의되었습니다.
public interface IComparer<in T>
{
int Compare(T x, T y);
}
COM을 사용할 때 선택적인 ref 키워드
COM 인터페이스에서 제공하는 메서드를 호출 할 때 메서드 호출자의 ref 키워드가 선택적입니다. 서명이있는 COM 메소드가 주어진다.
void Increment(ref int x);
호출은 이제 다음 중 하나로 기록 될 수 있습니다.
Increment(0); // no need for "ref" or a place holder variable any more
동적 멤버 검색
새로운 의사 유형 dynamic
이 C # 유형 시스템에 도입되었습니다. 이 System.Object
는 System.Object
로 취급되지만 이러한 유형의 값에 대한 멤버 액세스 (메서드 호출, 필드, 속성 또는 인덱서 액세스 또는 대리자 호출) 또는 응용 프로그램의 유형 액세스는 형식 검사없이 허용되며, 그것의 해결책은 런타임까지 연기된다. 이를 오리 입력 또는 후기 바인딩이라고합니다. 예 :
// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
return obj.Length;
}
GetLength("Hello, world"); // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42); // but not an integer - an exception will be thrown
// in GetLength method at run-time
이 경우 동적 유형은보다 자세한 Reflection을 피하기 위해 사용됩니다. 후드에서 여전히 반사를 사용하지만 캐싱 덕분에 대개 더 빠릅니다.
이 기능은 주로 동적 언어와의 상호 운용성을 목표로합니다.
// Initialize the engine and execute a file
var runtime = ScriptRuntime.CreateFromConfiguration();
dynamic globals = runtime.Globals;
runtime.ExecuteFile("Calc.rb");
// Use Calc type from Ruby
dynamic calc = globals.Calc.@new();
calc.valueA = 1337;
calc.valueB = 666;
dynamic answer = calc.Calculate();
동적 유형은 주로 정적으로 형식화 된 코드에서도 응용 프로그램을 포함합니다. 예를 들어 Visitor 패턴을 구현하지 않고도 이중 디스패치를 가능 하게 만들 수 있습니다.