Section 35.4: 컴파일 시점에는 알 수 없는 특정 타입 처리하기
아래의 두 클래스는 동일한 결과를 보여준다:
class IfElseExample {
public string DebugToString(object a) {
if (a is StringBuilder) {
return DebugToStringInternal(a as StringBuilder);
} else if (a is List < string > ) {
return DebugToStringInternal(a as List < string > );
} else {
return a.ToString();
}
}
private string DebugToStringInternal(object a) {
// Fall Back
return a.ToString();
}
private string DebugToStringInternal(StringBuilder sb) {
return $"StringBuilder - Capacity: {sb.Capacity}, MaxCapacity: {sb.MaxCapacity}, Value: {sb.ToString()}";
}
private string DebugToStringInternal(List < string > list) {
return $"List<string> - Count: {list.Count}, Value: {Environment.NewLine + "\t " + string.Join(Environment.NewLine + "\t ", list.ToArray())}";
}
}
class DynamicExample {
public string DebugToString(object a) {
return DebugToStringInternal((dynamic) a);
}
private string DebugToStringInternal(object a) {
// Fall Back
return a.ToString();
}
private string DebugToStringInternal(StringBuilder sb) {
return $"StringBuilder - Capacity: {sb.Capacity}, MaxCapacity: {sb.MaxCapacity}, Value: {sb.ToString()}";
}
private string DebugToStringInternal(List < string > list) {
return $"List<string> - Count: {list.Count}, Value: {Environment.NewLine + "\t " + string.Join(Environment.NewLine + "\t ", list.ToArray())}";
}
}
위 예제에서 dynamic
을 사용시의 장점은, 처리를 위한 새로운 타입을 추가하고자 할 때, DebugToStringInternal
메소드에 해당 타입에 대한 overload 만 하나 추가해주면 된다는 점이다. 이는 해당 메소드 호출 시 일일이 원하는 타입으로 타입 변환 (cast) 을 할 필요가 없다는 추가적인 장점이 있다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
'번역 > C# Notes for Professionals' 카테고리의 다른 글
36.2: MSDN 의 묵시적 (implicit) 연산자 예제 (0) | 2021.12.09 |
---|---|
36.1: 명시적 (explicit) 타입 변환하기 (0) | 2021.12.02 |
35.3: dynamic 반환하기 (0) | 2021.11.24 |
35.2: dynamic 변수 생성하기 (0) | 2021.11.24 |
35.1: 속성 (property) 을 갖는 dynamic 객체 생성하기 (0) | 2021.11.24 |