表达与名称

isx*_*ker 6 .net c# expression c#-6.0 nameof

它是用一个好主意,nameofexpressions提取属性的名称?

//method with expression
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression, bool isValid, [param: Localizable(true)] string validationError)
{
    string propertyName = PropertySupport.ExtractPropertyName(propertyExpression);
    RaisePropertyChanged(propertyName, isValid, validationError);
}

//the same logic without expression
protected void RaisePropertyChanged(string propertyName, [param: Localizable(true)] string validationError)
{
    RaisePropertyChanged(propertyName, validationError == null, validationError);
}
Run Code Online (Sandbox Code Playgroud)

但呼唤是不同的

public string Url
{
    set
    {
        //with nameof
        RaisePropertyChanged(nameof(Url), this.GetValidationError());
        //with expression
        RaisePropertyChanged(() => Url, this.GetValidationError());
    }
}
Run Code Online (Sandbox Code Playgroud)

你知道每种方法有哪些优点和缺点?或者只有执行速度很重要?我的意思nameofconst在编译后将替换为值.

Pat*_*man 12

为什么要使用表达式来执行编译时可以执行的操作?nameof(Url)在编译时确定.它花费0毫秒.之后评估.当你可以使用时,构建表达式是昂贵且毫无意义的nameof.

所以底线是:不要使用表达式,除非你真的必须(你已经在表达式中工作,你必须从那里开始).否则使用nameof.

  • 只是一个小小的补充:如果你不小心,使用表达式会导致运行时异常,而```nameof```会给你编译时错误. (5认同)