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/

반응형

+ Recent posts