ToB企服应用市场:ToB评测及商务社交产业平台

标题: CompilerGenerated与GeneratedCode区别 [打印本页]

作者: 宝塔山    时间: 2024-12-20 15:16
标题: CompilerGenerated与GeneratedCode区别
前言

迩来在捣鼓代码天生器,基于 Roslyn,我们可以让天生器项目天生我们的目的 C# 代码,这个也是MVVM Toolkit的实现方式,在检察天生代码的过程中,我们经常会碰到一些特殊的特性,如 GeneratedCodeAttribute ,刚好我还碰到过 CompilerGeneratedAttribute。感觉两个特性差不多,都可以用于标识代码的天生来源,帮助开发者和其他工具更好地理解和处理代码。
GeneratedCodeAttribute 解析

定义与用途

GeneratedCodeAttribute 是一个系统提供的特性,定义在 System.CodeDom.Compiler 命名空间,用于标记由工具或编译器天生的代码。它通常包含两个参数:天生工具的名称和版本号。
  1. [AttributeUsage(AttributeTargets.All, Inherited = false)]
  2. public sealed class GeneratedCodeAttribute : Attribute
  3. {
  4.     public string Tool { get; }
  5.     public string Version { get; }
  6.     public GeneratedCodeAttribute(string tool, string version)
  7.     {
  8.         Tool = tool;
  9.         Version = version;
  10.     }
  11. }
复制代码
这个特性的主要用途是:
示例

假设你有一个 Source Generator 工具名为 MyCustomTool,版本为 1.0.0,你可以这样标记天生的代码:
  1. [GeneratedCode("MyCustomTool", "1.0.0")]
  2. public partial class MyClass
  3. {
  4.     // 自动生成的代码
  5. }
复制代码
CompilerGeneratedAttribute 解析

定义与用途

CompilerGeneratedAttribute 定义在 System.Runtime.CompilerServices 命名空间,是一个更具体的特性,用于标记由 C# 编译器主动天生的代码片段。它没有参数,仅表示代码是由编译器天生的。
  1. [AttributeUsage(AttributeTargets.All, Inherited = false)]
  2. public sealed class CompilerGeneratedAttribute : Attribute
  3. {
  4. }
复制代码
这个特性的主要用途是:
示例

编译器天生的代码片段可能如下所示:
  1. [CompilerGenerated]
  2. private sealed class <>c__DisplayClass1_0
  3. {
  4.     public int x;
  5.     internal void <Method>b__0()
  6.     {
  7.         Console.WriteLine(x);
  8.     }
  9. }
复制代码
区别与选择

虽然 GeneratedCodeAttribute 和 CompilerGeneratedAttribute 都用于标识代码的天生来源,但它们有着差别的用途和适用场景。
代码天生器应用示例

MVVM Toolkit 就按照这个标准开发,假设你正在开发一个 Source Generator 来天生部分类文件:
  1. using Microsoft.CodeAnalysis;
  2. using Microsoft.CodeAnalysis.CSharp;
  3. using System.CodeDom.Compiler;
  4. public class MySourceGenerator : ISourceGenerator
  5. {
  6.     public void Initialize(GeneratorInitializationContext context)
  7.     {
  8.         // Initialization logic if needed
  9.     }
  10.     public void Execute(GeneratorExecutionContext context)
  11.     {
  12.         var sourceBuilder = new StringBuilder();
  13.         sourceBuilder.AppendLine("[GeneratedCode("MyCustomTool", "1.0.0")]");
  14.         sourceBuilder.AppendLine("public partial class MyClass");
  15.         sourceBuilder.AppendLine("{");
  16.         sourceBuilder.AppendLine("    public string MyProperty { get; set; }");
  17.         sourceBuilder.AppendLine("}");
  18.         context.AddSource("MyClass.g.cs", sourceBuilder.ToString());
  19.     }
  20. }
复制代码
上面代码中,GeneratedCodeAttribute 被用来标记天生的代码,确保其他工具和开发者知道这段代码是由 MyCustomTool 天生的。
一些发起:

总结

简单说来:
参考文献


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4