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

Razor syntax parsing and compilation performance impact for different valid expression variants

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

赋值:

<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" />

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

Razor 组件不是 类,也不是由 C# 编译器 (Roslyn) 严格编译的。它们是使用 Razor 语法的标记文件,在编译过程中由 Razor SDK 编译成 C# 文件。

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

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

@page "/Test"
<TextBox Value=@myVariable></TextBox>
<TextBox Value="@myVariable"></TextBox>
<TextBox Value="@(myVariable)"></TextBox>
<TextBox Value="myVariable"></TextBox>
@code {

    string 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";
    }

您可以在 /obj/debug/Net5.0/Razor/Pages/Test.razor.g.cs

查看此文件

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

我认为这只是关于您使用前三个中的哪一个的偏好情况。大括号对于单个变量输入是多余的。