C# Blazor编译器如何生成序列号?

C# Blazor编译器如何生成序列号?,c#,asp.net-core,compilation,blazor,C#,Asp.net Core,Compilation,Blazor,建议在构建自定义的RenderTree时使用常量序列号: 生成序列号丢失了有关原始代码中if/else分支和循环所在位置的所有有用信息。这导致的差异是以前的两倍。。。在更现实的情况下,对于复杂且嵌套较深的结构,尤其是对于循环,性能成本更为严重。diff算法不是立即识别插入或删除了哪些循环块或分支,而是深入到渲染树中,通常构建更长的编辑脚本,因为它错误地了解了新旧结构之间的关系 那么,如果在编译时无法确定集合的大小,Blazor编译器如何确定枚举元素(即循环中重复的元素)的序列值呢?下面是Blaz

建议在构建自定义的
RenderTree
时使用常量序列号:

生成序列号丢失了有关原始代码中if/else分支和循环所在位置的所有有用信息。这导致的差异是以前的两倍。。。在更现实的情况下,对于复杂且嵌套较深的结构,尤其是对于循环,性能成本更为严重。diff算法不是立即识别插入或删除了哪些循环块或分支,而是深入到渲染树中,通常构建更长的编辑脚本,因为它错误地了解了新旧结构之间的关系


那么,如果在编译时无法确定集合的大小,Blazor编译器如何确定枚举元素(即循环中重复的元素)的序列值呢?

下面是Blazor编译器如何编译.razor文件以及定义表元素的代码。请注意,在一个循环内添加的所有元素都具有相同的序列号

protected override void BuildRenderTree(RenderTreeBuilder builder)
            {
                builder.OpenElement(0, "table");
                builder.OpenElement(1, "tbody");

                for (var row = 0; row < 3; row++)
                {
                    builder.OpenElement(2, "tr");
                    for (var col = 0; col < 3; col++)
                    {
                        builder.OpenElement(3, "td");
                        builder.AddAttribute(4, "class", "tictactoe-cell");
                        builder.CloseElement();
                    }

                    builder.CloseElement();
                }

                builder.CloseElement();
                builder.CloseElement();
            }
        }
protected override void BuildRenderTree(RenderTreeBuilder)
{
建筑商开放元素(0,“表格”);
建造商开启件(1,“tbody”);
对于(变量行=0;行<3;行++)
{
建造商开放项目(2,“tr”);
for(变量col=0;col<3;col++)
{
建造商开放项目(3,“td”);
builder.AddAttribute(4,“类”,“tictactoe单元格”);
builder.CloseElement();
}
builder.CloseElement();
}
builder.CloseElement();
builder.CloseElement();
}
}
我建议您使用一些文本(“Blazor!”)定义一个简单的组件,并在另一个组件中动态实例化它,即用户输入文本框的次数。跑过去看看它是否有效。现在转到编译器生成的.g.cs文件,看看编译器最初生成了什么。来告诉我们你的实验

您的问题非常重要,当我们想要创建一个基于从数据库检索到的数据、搜索的概要文件结果列表等的菜单组件时,熟练掌握这个问题非常重要


希望这有助于

有趣的是,现在我想我想做更多的挖掘,看看这些序列号是如何影响渲染的。文档使它们看起来像树中元素的主键。