- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
最近在捣鼓代码生成器,基于 Roslyn,我们可以让生成器项目生成我们的目标 C# 代码,这个也是MVVM Toolkit的实现方式,在查看生成代码的过程中,我们经常会遇到一些特殊的特性,如 GeneratedCodeAttribute ,刚好我还遇到过 CompilerGeneratedAttribute。感觉两个特性差不多,都可以用于标识代码的生成来源,帮助开发者和其他工具更好地理解和处理代码.
GeneratedCodeAttribute
解析GeneratedCodeAttribute 是一个系统提供的特性,定义在 System.CodeDom.Compiler 命名空间,用于标记由工具或编译器生成的代码。它通常包含两个参数:生成工具的名称和版本号.
[AttributeUsage(AttributeTargets.All, Inherited = false)]
public sealed class GeneratedCodeAttribute : Attribute
{
public string Tool { get; }
public string Version { get; }
public GeneratedCodeAttribute(string tool, string version)
{
Tool = tool;
Version = version;
}
}
这个特性的主要用途是:
GeneratedCode
的代码可以提醒开发者不要直接编辑这些文件,因为它们是自动生成的,任何手动修改可能会在下次生成时丢失。GeneratedCodeAttribute
的代码,例如忽略代码覆盖率统计或特定的代码分析规则。假设你有一个 Source Generator 工具名为 MyCustomTool,版本为 1.0.0,你可以这样标记生成的代码:
[GeneratedCode("MyCustomTool", "1.0.0")]
public partial class MyClass
{
// 自动生成的代码
}
CompilerGeneratedAttribute
解析CompilerGeneratedAttribute 定义在 System.Runtime.CompilerServices 命名空间,是一个更具体的特性,用于标记由 C# 编译器自动生成的代码片段。它没有参数,仅表示代码是由编译器生成的.
[AttributeUsage(AttributeTargets.All, Inherited = false)]
public sealed class CompilerGeneratedAttribute : Attribute
{
}
这个特性的主要用途是:
编译器生成的代码片段可能如下所示:
[CompilerGenerated]
private sealed class <>c__DisplayClass1_0
{
public int x;
internal void <Method>b__0()
{
Console.WriteLine(x);
}
}
虽然 GeneratedCodeAttribute 和 CompilerGeneratedAttribute 都用于标识代码的生成来源,但它们有着不同的用途和适用场景.
来源不同:
GeneratedCodeAttribute
通常由外部工具或源代码生成器添加,以标识代码是由某个工具生成的,一般来说是出于编码人员的自身目标。CompilerGeneratedAttribute
由 C# 编译器自身添加,用于标识编译器生成的代码片段。应用场景:
GeneratedCodeAttribute
。CompilerGeneratedAttribute
的类或成员,这通常是编译器为了实现某些语言特性而生成的代码,不应被手动修改。MVVM Toolkit 就按照这个标准开发,假设你正在开发一个 Source Generator 来生成部分类文件:
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System.CodeDom.Compiler;
public class MySourceGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
// Initialization logic if needed
}
public void Execute(GeneratorExecutionContext context)
{
var sourceBuilder = new StringBuilder();
sourceBuilder.AppendLine("[GeneratedCode(\"MyCustomTool\", \"1.0.0\")]");
sourceBuilder.AppendLine("public partial class MyClass");
sourceBuilder.AppendLine("{");
sourceBuilder.AppendLine(" public string MyProperty { get; set; }");
sourceBuilder.AppendLine("}");
context.AddSource("MyClass.g.cs", sourceBuilder.ToString());
}
}
上面代码中,GeneratedCodeAttribute 被用来标记生成的代码,确保其他工具和开发者知道这段代码是由 MyCustomTool 生成的.
一些建议:
- 不适用于用户可修改的模板:如果有一个代码生成工具生成的模板,用户可能会根据需要对其进行修改,那么就不应该使用
GeneratedCodeAttribute
标记这些模板。因为一旦代码被手动修改,再用GeneratedCodeAttribute
标记就不再准确了,而且可能会误导其他工具忽略这些手动修改的内容。
- 部分类的特殊处理:当生成的代码是部分类的一部分时,不要在整个类上应用
GeneratedCodeAttribute
。相反,你应该仅将此特性应用于该部分类中生成的具体成员(如方法、字段、属性等)。这是因为部分类可以有多个文件定义,而用户可能在其他文件中添加自己的实现。通过只标记生成的成员,你可以确保只有自动生成的部分被正确标识,而不会影响用户添加的代码。(这个可以看 MVVM Toolkit 生成的代码)
简单说来:
GeneratedCodeAttribute
主要用于标记由工具或编译器生成的代码,特别是那些会频繁重新生成的代码。这有助于开发者和其他工具识别这些代码片段,并避免对它们进行不必要的修改。CompilerGeneratedAttribute
一般不要手动添加到代码中。最后此篇关于CompilerGenerated与GeneratedCode区别的文章就讲到这里了,如果你想了解更多关于CompilerGenerated与GeneratedCode区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何/在哪里可以找到生成的 ViewBinding 代码? 每当我尝试 control+click/control+b 来查看声明时,AndroidStudio 只会打开 XML 布局。 最佳答案 生
我的应用程序报告它已经加载了一个名为“Microsoft.GeneratedCode”的程序集。我想验证我的应用程序或程序集后面的哪一部分正在生成这个特定的程序集。程序集仅加载一次。 有关加载程序集的
我是一名优秀的程序员,十分优秀!