2016-06-21 10 views
2

CallerMemberName은 어떻게 구현됩니까?멤버 이름이 nameof 인 메소드를 제공해야합니까? 아니면 CallerMemberName에 의존해야합니까?

내가하는 일을 이해하면 코드에서 마법의 문자열을 지킬 수 있습니다. 그러나 nameof 이상으로 사용해야하고 더 좋은 것은 무엇입니까?

차이점/CallerMemberName은 어떻게 작동합니까?

+3

두 가지 서로 관련이없는 시나리오입니다. 'CallerMemberName'은 누가 당신을 부르는 지 알려주고,'nameof'는 당신이 누구인지를 알려줍니다. – GSerg

+2

내가 생각하기에 :'nameof'를 사용하여 멤버 이름으로 메소드를 제공해야합니까, 아니면'CallerMemberName'에 의존해야합니까? –

+0

@PatrickHofman true, ill edit – Mafii

답변

4

CallerMemberName은 현재 멤버의 이름을 다른 메서드 호출에 배치하는 컴파일 타임 트릭입니다. nameof도 비슷한 일을하는 컴파일 타임 트릭이다. 이것은 멤버의 문자열 표현을 취한다.

어느 것이 당신에게 달려 있습니다. 나는 말할 수있다 : 당신이 할 수있는 곳에서 CallerMemberName을 사용하고, 어디에서 nameof을 사용해야하는지. CallerMemberNamenameof보다 더 자동화되어 있으므로 그 중 하나를 선호합니다.

둘 모두 동일한 성능 영향을 미칩니다. 컴파일 시간에만 코드를 평가하는 데 약간의 시간이 걸리지 만 무시할 수 있습니다.

+0

따라서 호출은 문자열이있는 간단한 호출로 바뀝니다 (따라서 nameof 대신 문자열 리터럴을 사용할 때와 동일합니까?) – Mafii

+1

참으로. 그것은 모두 동일합니다. –

4

[CallerMemberName]nameof은 완전히 바꿔 쓸 수 없습니다. 때로는 동일한 방법에 대해 이야기하고있을 때도 때로는 첫 번째, 때로는 두 번째가 필요할 수 있습니다.

class Foo : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    private string title; 

    public string Title 
    { 
     get { return title; } 
     set 
     { 
      if (title != value) 
      { 
       title = value; 
       // we're using CallerMemberName here 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public void Add(decimal value) 
    { 
     Amount += value; 
     // we can't use CallerMemberName here, because it will be "Add"; 
     // instead of this we have to use "nameof" to tell, what property was changed 
     OnPropertyChanged(nameof(Amount)); 
    } 

    public decimal Amount { get; private set; } 
}