Section 9.6: nameof 를 generic 의 type parameter 에 적용하기

코드

public class SomeClass < TItem > { public void PrintTypeName() { Console.WriteLine(nameof(TItem)); } } var myClass = new SomeClass < int > (); myClass.PrintTypeName(); Console.WriteLine(nameof(SomeClass < int > ));

콘솔 출력

TItem SomeClass
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 9.5: PropertyChanged 이벤트 처리하기

코드

public class BugReport: INotifyPropertyChanged { public string Title { ... } public BugStatus Status { ... } } ... private void BugReport_PropertyChanged(object sender, PropertyChangedEventArgs e) { var bugReport = (BugReport) sender; switch (e.PropertyName) { case nameof(bugReport.Title): Console.WriteLine("{0} changed to {1}", e.PropertyName, bugReport.Title); break; case nameof(bugReport.Status): Console.WriteLine("{0} changed to {1}", e.PropertyName, bugReport.Status); break; } } ... var report = new BugReport(); report.PropertyChanged += BugReport_PropertyChanged; report.Title = "Everything is on fire and broken"; report.Status = BugStatus.ShowStopper;

콘솔 출력

Title changed to Everything is on fire and broken Status changed to ShowStopper
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

다음과 같이 흔하게 사용되는 느슨한 (loosely) 타입 형식을 사용하는 대신,

@Html.ActionLink("Log in", "UserController", "LogIn")

Action link 를 다음과 같이 강한 (strongly) 타입 형식으로 만들 수 있다:

@Html.ActionLink("Log in", @typeof(UserController), @nameof(UserController.LogIn))

이렇게 하면 사용자의 코드를 리팩토링하여 UserController.LogIn 메소드의 이름을 UserController.SignIn 으로 변경한다고 해도, 해당 문자열을 모두 검색하여 수정해 줄 필요가 없어진다. 컵파일러가 변경된 메소드의 이름을 찾아줄 것이다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 9.3: 인자 검사와 보호 구문 (Guard Clause)

인자를 검사하는 보호 구문을 작성함에 있어,

public class Order { public OrderLine AddOrderLine(OrderLine orderLine) { if (orderLine == null) throw new ArgumentNullException(nameof(orderLine)); ... } }

위와 같은 코드를 사용하는 것이 다음 코드보다 더 권장된다.

public class Order { public OrderLine AddOrderLine(OrderLine orderLine) { if (orderLine == null) throw new ArgumentNullException("orderLine"); ... } }

이는, nameof 기능을 사용하면 메소드의 인자를 리팩토링하기 더욱 쉬워지기 때문이다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 9.2: PropertyChanged 이벤트 발생시키기

코드

public class Person: INotifyPropertyChanged { private string _address; public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public string Address { get { return _address; } set { if (_address == value) { return; } _address = value; OnPropertyChanged(nameof(Address)); } } } ... var person = new Person(); person.PropertyChanged += (s, e) => Console.WriteLine(e.PropertyName); person.Address = "123 Fake Street";

콘솔 출력

Address
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 9.1: nameof 기본 사용법: 변수 이름 출력하기

nameof 연산자를 이용하면 사용자는 특정 변수나 타입, 혹은 멤버의 이름을 리터럴 형식으로 하드코딩하지 않고도 손쉽게 얻어올 수 있게 된다. 이 작업은 컴파일 시점에 수행되므로, IDE 의 이름 변경하기 기능을 활용하여 참조되는 식별자와 그에 해당하는 이름 문자열 모두를 변경할 수 있게 될 것이다.

var myString = "String Contents"; Console.WriteLine(nameof(myString));

위 코드는 아래와 같은 결과를 출력할 것이다.

myString

이는 해당 변수의 이름이 "myString" 이기 때문이며, 해당 변수 이름을 변경하는 리팩토링 수행 시 출력되는 변수 이름 역시 함께 변경될 것이다.

만약 nameof 연산자가 reference 타입에 대해서 호출이 되었다면, reference 대상 객체의 이름이나 타입이 아닌 현재 reference 자체의 이름이 반환될 것이다.

아래 예제를 확인하라:

string greeting = "Hello!"; Object mailMessageBody = greeting; Console.WriteLine(nameof(greeting)); // "greeting" 을 반환한다 Console.WriteLine(nameof(mailMessageBody)); // "greeting" 이 아닌 "mailMessageBody" 를 반환함에 유의하라
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Chapter 9: nameof 연산자

nameof 연산자는 특정 변수나 타입, 혹은 멤버의 이름을 하드코딩한 리터럴 없이도 문자열 형태로 얻어올 수 있는 기능을 제공한다. 이 기능은 컴파일 타임에 이루어지므로, 사용자는 IDE 에서 제공하는 이름 일괄 변경 기능을 통해 코드 내에서 참조되는 식별자들의 이름을 변경할 수 있으며, 이렇게 변경된 이름 문자열 역시 자동으로 결과에 반영될 수 있게 된다.

역주: 위 설명은 이 링크 의 질문처럼 아래와 같은 코드에서 Foo 에 대한 이름 자동 변경을 하는 경우에 대한 설명으로 보입니다.

public void Foo(Bar arg) { throw new ArgumentException("Argument is incompatible with " + nameof(Foo)); }
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

Section 8.4: Null 조건부 연산자를 Extension Method 와 함께 사용하기

본디 Extension Method 자체가 null reference 에 대해서도 동작하게 되어 있으나, ?. 을 이용하여 null 체크를 하는 것 역시 가능하다.

public class Person { public string Name { get; set; } } public static class PersonExtensions { public static int GetNameLength(this Person person) { return person == null ? -1 : person.Name.Length; } }

보통은, 이 메소드가 null reference 에 대해서 불리는 경우 -1 값을 반환하게 될 것이다:

Person person = null; int nameLength = person.GetNameLength(); // -1 을 반환한다.

?. 을 이용하면 이 메소드가 null reference 에 대해서는 불리지 않을 것이며, 반환 타입은 int? 이 될 것이다:

Person person = null; int? nameLength = person?.GetNameLength(); // nameLength 는 null 이 된다.

이러한 결과는 사실 ?. 연산자가 동작하는 방식으로부터 충분히 예상 가능하다: NullReferenceException 이 발생되는 것을 피하기 위해, null instance 에 대해서는 instance method 호출을 피하도록 되어 있기 때문이다.

그러나, method 의 선언 방식에 대해서만 차이가 있을 뿐, 사실 동일한 회피 로직은 extension method 에 대해서도 적용되어 있다.

첫번째 예제에서 어떠한 이유로 extension method 가 호출이 되고 있는지에 대한 추가 정보를 확인하고 싶다면, "Section 48.2 Extension method - null 체크하기" 문서를 참고하라.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts