Source Generator:C# 9 将迎来编译时元编程

源码生成器(Source Generator)是 C#编译器的一个新特性,开发者可以使用编译器生成的元数据检查用户代码,并生成附加的源文件,与程序的其他部分一起编译。

受 F#类型提供程序的启发,C#源码生成器的目标也是为了启用元编程,只是以一种完全不同的方式。实际上,F#类型提供程序在内存中触发类型、属性和方法,而源码生成器是将 C#代码重新加入编译过程。

源码生成器不能修改已有代码,只能向编译添加新代码。源码生成器的另一个限制是它不对其他源码生成器生成的代码起作用。这样可以确保每个代码生成器将看到相同的编译输入,而不管应用程序的顺序是怎样的。有趣的是,源码生成器并不局限于检查源代码及其相关的元数据,它们还可以访问其他文件。

具体来说,源码生成器并不是代码重写工具,比如优化器或代码注入器,也不是用来创建新的语言特性的,尽管这在技术上来说是可行的。源码生成器的使用场景包括自动接口实现、数据序列化,等等。在源码生成器指南中可以找到更多应用场景,其中还包含了讨论内容。

源码生成器与 Roslyn 代码分析器有很大的关系,这从它的接口定义可以很明显地看出来:

namespace Microsoft.CodeAnalysis
{public interface ISourceGenerator{void Initialize(InitializationContext context);void Execute(SourceGeneratorContext context);}
}

编译器调用 Initialize 方法,生成器注册一些稍后将会调用的回调函数。代码生成发生在 Execute 方法里,它的参数是一个 SourceGeneratorContext 对象,该对象提供对当前 Compilation 对象的访问。

namespace Microsoft.CodeAnalysis
{public readonly struct SourceGeneratorContext{public ImmutableArray<AdditionalText> AdditionalFiles { get; }public CancellationToken CancellationToken { get; }public Compilation Compilation { get; }public ISyntaxReceiver? SyntaxReceiver { get; }public void ReportDiagnostic(Diagnostic diagnostic) { throw new NotImplementedException(); }public void AddSource(string fileNameHint, SourceText sourceText) { throw new NotImplementedException(); }}
}

可以修改 SourceGeneratorContext 对象,使用 AddSource 来包含其他代码。正如上面提到的,源码生成器不仅限于 C#文件。这从 AdditionalFiles 就可以看出来,它支持传给编译器的任意文件。

综上所述,要为“hello world”程序定义一个普通的源码生成器可以这样:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;namespace SourceGeneratorSamples
{[Generator]public class HelloWorldGenerator : ISourceGenerator{public void Execute(SourceGeneratorContext context){// begin creating the source we'll inject into the users compilationvar sourceBuilder = new StringBuilder(@"
using System;
namespace HelloWorldGenerated
{public static class HelloWorld{public static void SayHello() {Console.WriteLine(""Hello from generated code!"");Console.WriteLine(""The following syntax trees existed in the compilation that created this program:"");
");// using the context, get a list of syntax trees in the users compilationvar syntaxTrees = context.Compilation.SyntaxTrees;// add the filepath of each tree to the class we're buildingforeach (SyntaxTree tree in syntaxTrees){sourceBuilder.AppendLine($@"Console.WriteLine(@"" - {tree.FilePath}"");");}// finish creating the source to injectsourceBuilder.Append(@"}}
}");// inject the created source into the users compilationcontext.AddSource("helloWorldGenerator", SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));}public void Initialize(InitializationContext context){// No initialization required for this one}}
}

微软已经发布了更多的介绍性示例,向开发人员展示如何使用这个新特性。

源代码生成器可在.NET 5 预览版和最新的 Visual Studio 预览版中使用。这个特性仍然处于早期阶段,它的 API 和特性可能会在将来的版本中发生变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

凸包算法知识总结

首先&#xff0c;什么是凸包&#xff1f; 假设平面上有p0~p12共13个点&#xff0c;过某些点作一个多边形&#xff0c;使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候&#xff0c;我们就叫它“凸包”。 处理何种问题&#xff1a;凸包可以看成在木板上钉许多…

计算机用英语表示方法有哪些,在计算机领域中,通常用英文单词“bit”来表示( )...

答案查看答案解析:【解析题】现代计算机系统由硬件系统和软件系统组成。人类直接操控硬件系统太复杂了&#xff0c;所以&#xff0c;将硬件的功能进行封装&#xff0c;只提供一个接口给人类使用&#xff0c;这个接口就是操作系统。【解析题】计算机网络的主要功能是 。【解析题…

[C++11]shared_ptr使用的注意事项(内存被重复析构,内存泄漏问题)

shared_ptr使用的注意事项: 1.不能使用一个原始地址初始化多个共享智能指针 2.函数不能返回管理了this的共享智能指针对象 3.共享智能指针不能循环引用 不能使用一个原始地址初始化多个共享智能指针 代码如下: #include <iostream> #include <memory> using name…

一文解读使用WinDbg排查iis 中CPU占用高的站点问题

一、概述在Window服务器部署程序后&#xff0c;可能因为代码的不合理或者其他各种各样的问题&#xff0c;会导致CPU暴增&#xff0c;甚至达到100%等情况&#xff0c;严重危及到服务器的稳定以及系统稳定&#xff0c;但是一般来说对于已发布的程序&#xff0c;没法即时看到出问题…

Power Network POJ - 1459(EK算法模板+详解)

题意&#xff1a; 总共有a个节点&#xff0c;其中有发电站b个、用户c个和调度器a-b-c个三种节点&#xff0c;每个发电站有一个最大发电量&#xff0c;每个用户有个最大接受电量&#xff0c;现在有d条有向边&#xff0c;边有一个最大的流量代表&#xff0c;最多可以流出这么多电…

[C++11]shared_ptr共享智能指针的初始化与使用

使用智能指针需要添加头文件: 代码如下: #include <memory>shared_ptr使用的注意事项: 1.不能使用一个原始地址初始化多个共享智能指针 2.函数不能返回管理了this的共享智能指针对象 3.共享智能指针不能循环引用 初始化: 1.通过构造函数初始化 代码如下: std::shar…

ap计算机科学课程内容,AP计算机科学课程补习有哪些知识点梳理?

计算机作为当前最被看好的一大专业领域&#xff0c;很多同学们在AP课程学习期间会选修AP计算机科学课程补习这门课来帮助自己打好知识基础。那么AP计算机科学课程补习有哪些知识点梳理?今天学通国际教育老师为大家介绍。1. Introductory Java Language FeaturesPackage And Cl…

人在职场,表达似水

最近几天集中在和部门内的小伙伴做1&#xff1a;1Talk。发现有不少人表达能力真的不是很好&#xff0c;而且水平长期停滞不前。现场与他们分享了一些我的经验&#xff0c;趁热打铁也想在这里分享给大家。表达能力不好本身就是做技术的人身上的一个常见标签。如果仅仅是标签也就…

计算机网络原理习题

下一跳路由器计算 设某路由器建立了如下路由表&#xff08;这三列分别是目的网络、子网掩码和下一跳路由器&#xff0c;若直接交付则最后一列表示应当从哪一个接口转发出去&#xff09;&#xff1a; 128.96.39.0 255.255.255.128 接口0 128.96.39.128 255.255.255.128 接口1…

[C++11]弱引用智能指针weak_ptr初始化和相关的操作函数

弱引用智能指针 std::weak_ptr 可以看做是 shared_ptr 的助手&#xff0c;它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符 * 和 ->&#xff0c;因为它不共享指针&#xff0c;不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减…

电子科技大学计算机网络技术专业,计算机专业前景如何?最强十大高校有哪些?电子科大排名多少?...

近几年计算机专业以及与计算机相关的专业可谓是火的不能再火&#xff0c;越来越多的考生在高考时选择了计算机专业或者与计算机相关的专业&#xff01;事实也是如此&#xff0c;随着科技的进步&#xff0c;信息技术的迅猛发展&#xff0c;特别是计算机技术的发展&#xff0c;以…

写一个简版 asp.net core

动手写一个简版 asp.net coreIntro之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架&#xff0c;最近参考蒋老师和 Edison 的文章和代码&#xff0c;结合自己对 asp.net core 的理解 &#xff0c;最近自己写了一个 MiniAspNetCore &#xff0c;写篇文章总结一…

Enlarge GCD CodeForces - 1034A(欧拉筛+最大公约数)

题意&#xff1a; 给出n个数&#xff0c;删去其中一些使得总的gcd(最大公约数)最大 题目&#xff1a; Mr. F has n positive integers, a1,a2,…,an. He thinks the greatest common divisor of these integers is too small. So he wants to enlarge it by removing some …

网桥工作在计算机网络的,网桥的作用和工作原理是什么

网络像一个巨大的蜘蛛网&#xff0c;连接着我们每个人的生活。对于网络&#xff0c;我们看不见也摸不着&#xff0c;但是却离不开它。无形的网络到底是怎么运作的呢?我们是如何通过网络实现人与人之间的交流的呢?今天小编就给大家普及一下网桥的知识&#xff0c;网桥在计算机…

[C++11]独占的智能指针unique_ptr的删除器

unique_ptr 指定删除器和 shared_ptr 指定删除器是有区别的&#xff0c;unique_ptr 指定删除器的时候需要确定删除器的类型&#xff0c;所以不能像 shared_ptr 那样直接指定删除器&#xff0c;举例说明&#xff1a; 代码如下: #include <iostream> #include <memory…

如何在Windows上使用Git创建一个可执行脚本?

长话短说&#xff0c;今天介绍如何在windows上使用Git上创建一个可执行的shell脚本。“首先我们要知道windows上Git默认添加的文件权限是:-rw-r--r--(对应权限值是644)&#xff0c;而通常创建的shell脚本都希望天然可执行&#xff0c;故有必要在Windows上使用Git管理shell脚本时…

计算机公共基础知识实验报告,20140902413 李雪瑞 计算机工程系实验报告345.docx...

20140902413 李雪瑞 计算机工程系实验报告345计算机工程系实验报告课程名称&#xff1a;Java程序设计成 绩&#xff1a;实验项目名称&#xff1a;JAVA语言实现面向对象编程基础指导教师&#xff1a;(签名)班级: 计科14-4班姓名: 李雪瑞学号: 20140902413一、实 验 目 的: 1. 通…

Most Unstable Array CodeForces - 1353A(数学+贪心+建设性算法)

题意&#xff1a; 给定 n, m&#xff0c;构造出一个长度为 n 的数组 a&#xff0c;使得数组的和为 m&#xff0c;在此条件下∑i1n−1∣ai−ai−1∣\sum_{i1}^{n-1}|a_{i}−a_{i-1}|i1∑n−1​∣ai​−ai−1​∣ 最大是多少&#xff1f; 题目&#xff1a; You are given two …

[C++11]共享智能指针shared_ptr指定删除器

当智能指针管理的内存对应的引用计数变为 0 的时候&#xff0c;这块内存就会被智能指针析构掉了。另外&#xff0c;我们在初始化智能指针的时候也可以自己指定删除动作&#xff0c;这个删除操作对应的函数被称之为删除器&#xff0c;这个删除器函数本质是一个回调函数&#xff…