How is CallerMemberName implemented?
I get what it does - it allows us to keep magic strings out of our code - but should it be used over nameof and what is more performant? 
Whats the difference/how does CallerMemberName exactly work?
How is CallerMemberName implemented?
I get what it does - it allows us to keep magic strings out of our code - but should it be used over nameof and what is more performant? 
Whats the difference/how does CallerMemberName exactly work?
                        
                            
                        
                        
                            On
                            
                                                    
                    
                [CallerMemberName] and nameof are not completely interchangeable. Sometimes you need first one, sometimes - second one, even when we're talking about the same method:
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; }
}
                        
CallerMemberNameis a compile time trick to place the name of the current member in the call to another method.nameofis also a compile time trick to do something similar: it takes the string representation of a member.Which to use is up to you. I would say: use
CallerMemberNamewhere you can, andnameofwhere you must.CallerMemberNameis even more automated thannameof, so that is why I prefer that one.Both have the same performance implication: only on compile time it takes some extra time to evaluate the code, but that is neglectable.