.net Razor语法解析和编译对不同有效表达式变体的性能影响

.net Razor语法解析和编译对不同有效表达式变体的性能影响,.net,razor,blazor,roslyn,.net,Razor,Blazor,Roslyn,给定以下不同的有效表达式变体,哪一个是最正确和/或最快的解析和编译 价值分配: <TextBox Value=@myVariable></TextBox> <TextBox Value="@myVariable"></TextBox> <TextBox Value="@(myVariable)"></TextBox> <TextBox Value="@(myVaria

给定以下不同的有效表达式变体,哪一个是最正确和/或最快的解析和编译

价值分配:

<TextBox Value=@myVariable></TextBox>
<TextBox Value="@myVariable"></TextBox>
<TextBox Value="@(myVariable)"></TextBox>
<TextBox Value="@(myVariable.Summary)"></TextBox>
<TextBox Value="@myVariable.Summary"></TextBox>
<TextBox Value=@(myVariable.Summary)></TextBox>
<ValidationMessage For=@(() => context.Value.ValuePhoneNumber) />
<ValidationMessage For="@(() => context.Value.ValuePhoneNumber)" />
<ValidationMessage For="() => context.Value.ValuePhoneNumber" />

复杂值赋值:

<TextBox Value=@myVariable></TextBox>
<TextBox Value="@myVariable"></TextBox>
<TextBox Value="@(myVariable)"></TextBox>
<TextBox Value="@(myVariable.Summary)"></TextBox>
<TextBox Value="@myVariable.Summary"></TextBox>
<TextBox Value=@(myVariable.Summary)></TextBox>
<ValidationMessage For=@(() => context.Value.ValuePhoneNumber) />
<ValidationMessage For="@(() => context.Value.ValuePhoneNumber)" />
<ValidationMessage For="() => context.Value.ValuePhoneNumber" />

表达式赋值:

<TextBox Value=@myVariable></TextBox>
<TextBox Value="@myVariable"></TextBox>
<TextBox Value="@(myVariable)"></TextBox>
<TextBox Value="@(myVariable.Summary)"></TextBox>
<TextBox Value="@myVariable.Summary"></TextBox>
<TextBox Value=@(myVariable.Summary)></TextBox>
<ValidationMessage For=@(() => context.Value.ValuePhoneNumber) />
<ValidationMessage For="@(() => context.Value.ValuePhoneNumber)" />
<ValidationMessage For="() => context.Value.ValuePhoneNumber" />
context.Value.ValuePhoneNumber)/>

不确定您是否完全理解Razor组件和C#文件之间的区别,因此如果我告诉您一些您已经知道的事情,请道歉

Razor组件不是类,也不是由C#编译器(Roslyn)严格编译的。它们是使用Razor语法的标记文件,作为编译过程的一部分,Razor SDK会将它们编译成C#文件

要回答您的问题,请查看从Razor标记构建的C#代码

以下Razor组件(名为/Pages/Test.Razor):

@page”/Test
@代码{
字符串myVariable=“Hello World”;
}
在编译之前预编译到以下C#文件中

    [Microsoft.AspNetCore.Components.RouteAttribute("/test")]
    public partial class Inject : Microsoft.AspNetCore.Components.ComponentBase
    {
        protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder)
        {
            __builder.OpenComponent<Blazor.Starter.Components.TextBox>(0);
            __builder.AddAttribute(1, "Value", Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck<System.String>(
                 myVariable
            ));
            __builder.CloseComponent();
            __builder.AddMarkupContent(2, "\r\n");
            __builder.OpenComponent<Blazor.Starter.Components.TextBox>(3);
            __builder.AddAttribute(4, "Value", Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck<System.String>(
                 myVariable
            ));
            __builder.CloseComponent();
            __builder.AddMarkupContent(5, "\r\n");
            __builder.OpenComponent<Blazor.Starter.Components.TextBox>(6);
            __builder.AddAttribute(7, "Value", Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck<System.String>(
                  myVariable
            ));
            __builder.CloseComponent();
            __builder.AddMarkupContent(8, "\r\n");
            __builder.OpenComponent<Blazor.Starter.Components.TextBox>(9);
            __builder.AddAttribute(10, "Value", "myVariable");
            __builder.CloseComponent();
        }
    string myVariable = "Hello World";
    }
[Microsoft.AspNetCore.Components.RouteAttribute(“/test”)]
公共部分类注入:Microsoft.AspNetCore.Components.ComponentBase
{
受保护的覆盖void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder\uuu builder)
{
__OpenComponent(0);
__builder.AddAttribute(1,“值”,Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck(
myVariable
));
__builder.CloseComponent();
__builder.AddMarkupContent(2,“\r\n”);
__OpenComponent(3);
__builder.AddAttribute(4,“值”,Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck(
myVariable
));
__builder.CloseComponent();
__builder.AddMarkupContent(5,“\r\n”);
__OpenComponent(6);
__builder.AddAttribute(7,“值”,Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.TypeCheck(
myVariable
));
__builder.CloseComponent();
__builder.AddMarkupContent(8,“\r\n”);
__OpenComponent(9);
__AddAttribute(10,“值”,“myVariable”);
__builder.CloseComponent();
}
字符串myVariable=“Hello World”;
}
您可以在/obj/debug/Net5.0/Razor/Pages/Test.Razor.g.cs上看到此文件

为了回答您的问题,前三个都生成相同的C#代码,因此没有差异(也没有编译时差异)。第四个没有按预期工作,因为Razor将变量名视为字符串


我认为这只是一个偏好的例子,你会选择前三个选项中的哪一个。花括号对于单个变量输入来说是多余的。

“最正确”可能是一个有效的问题。解析的速度是非常不相关的。这里Roslin没有解析它。@HenkHolterman您的评论不是很有用,而且,解析和编译速度对于大型项目来说很重要。请删除你的否决票,如果它是你的。是的,当你有很多这样的结果时,解析上的差异可能会加起来几纳秒。谢谢你的解释。我的意思是,在考虑大型项目和IntelliSense时,使用一种或另一种方法是否有任何区别?我看不出这有什么区别,但由于我没有深入研究代码,我实际上不知道。