不同有效表达式变体的 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 将变量名称视为字符串。
我认为这只是关于您使用前三个中的哪一个的偏好情况。大括号对于单个变量输入是多余的。
给定以下不同的有效表达式变体,哪一个是最正确的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 将变量名称视为字符串。
我认为这只是关于您使用前三个中的哪一个的偏好情况。大括号对于单个变量输入是多余的。