当前位置:网站首页>Roslyn 节点的 Span 和 FullSpan 有什么区别
Roslyn 节点的 Span 和 FullSpan 有什么区别
2022-08-04 14:49:00 【林德熙】
本文告诉大家在使用 Roslyn 分析代码时,使用的 Span 和 FullSpan 有什么区别
在开始读本文之前,希望大家已经了解部分关于 Roslyn 的知识,如果是通过搜索进来的,大概就是已经知道基础的写法了。如果是通过本渣的推荐看到本文,本渣会详细告诉大家如何做。
准备
先写出一个简单的类用来分析
using System;
namespace BebehersoSerdar
{
class Foo
{
/// <summary>
/// 设置或获取NawraSaw
/// </summary>
public string NawraSaw { get; set; }
public void RorgiWhiseaSawrear()
{
Console.WriteLine(NawraSaw);
}
public void TurlouDismemteeka()
{
// 输出一个值
Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释
// 下一句代码
}
}
}创建语法树
把前面这个文件拿出来,用这个文件来创建语法树
var file = new FileInfo(@"D:\lindexi\roslyn\BebehersoSerdar\BebehersoSerdar\Foo.cs");
string content;
using (var stream = new StreamReader(file.OpenRead()))
{
content = stream.ReadToEnd();
}
var tree = CSharpSyntaxTree.ParseText(content);文件的路径就是刚才写的代码文件
通过 CSharpSyntaxTree.ParseText 就可以拿到语法树
访问语法树
为了访问语法树,需要创建一个类继承 CSharpSyntaxWalker 这里创建的类是 DowkurTicesoo 请看代码
public class DowkurTicesoo : CSharpSyntaxWalker
{
}本文说道了这里还没有告诉大家 Span 是什么,这个属性就是对应文本的第多少个字符开始和字符的长度。通过 Span 可以找到代码对应的文本。
所以在这里需要多创建一个方法,用来把 Span 转换为字符串
public DowkurTicesoo(string content, SyntaxWalkerDepth depth = SyntaxWalkerDepth.Node) : base(depth)
{
Content = content;
}
private string Content { get; }
public string GetText(TextSpan span)
{
return Content.Substring(span.Start, span.Length);
}访问方法
这里直接就告诉大家如何访问方法,因为只有在方法里面才可以比较直观看到 Span 和 FullSpan 的不同
通过重写方法就可以拿到一个类的所有方法,请看代码
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
base.VisitMethodDeclaration(node);
}在方法这里打断点可以看到进来两次,因为存在两个方法 RorgiWhiseaSawrear 和 TurlouDismemteeka 会进来两遍
先直接把方法的 Span 和 FullSpan 输出出来,请看代码
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
Console.WriteLine(GetText(node.Span));
Console.WriteLine(GetText(node.FullSpan));
base.VisitMethodDeclaration(node);
}这时运行可以看到这个输出
可以看到 Span 和 FullSpan 的一个不同是 Span 是从方法的第一个代码字符开始,和 Span 不同的是 FullSpan 是从方法的距离上一个代码结束开始的字符到方法结束的最后的字符
访问表达式
在另一个方法 TurlouDismemteeka 可以看到两个属性拿到的值的不同,因为这个方法里调用表达式,所以需要使用下面的方法拿到值
public override void VisitExpressionStatement(ExpressionStatementSyntax node)
{
Console.WriteLine(GetText(node.Span));
Console.WriteLine(GetText(node.FullSpan));
base.VisitExpressionStatement(node);
}对于 RorgiWhiseaSawrear 方法,两个属性的输出只有很少的不同
Console.WriteLine(NawraSaw);
Console.WriteLine(NawraSaw);
\r\n也就是 Span 就是去掉了 RorgiWhiseaSawrear 的前后空白,上面的 \r\n 是告诉大家这里还有一个换行符
但是对于 TurlouDismemteeka 就可以看到明显的不相同,第二个属性可以拿到注释
Console.WriteLine(NawraSaw);
// 输出一个值
Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释
\r\n在 VisualStudio 可以看到的转换 FullSpan 的值是 " // 输出一个值\r\n Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释\r\n"
可以看到注释下一句代码没有被引用,但是如果在 TurlouDismemteeka 的第一句代码多加一些换行,在 FullSpan 是可以转换
public void TurlouDismemteeka()
{
// 输出一个值
Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释
// 下一句代码
}这时从 VisualStudio 转换是多了换行"\r\n // 输出一个值\r\n Console.WriteLine(NawraSaw);// 代码需要多写没有用的注释\r\n",也就是引号后面多了\r\n的换行
不同
实际上在很多的方法里,使用 Span 和 FullSpan 都是没有什么区别。
用一句话来说明就是 Span 就只包括代码,而 FullSpan 包括了代码和代码附近的注释。
对于不同的结点的 Span 是不会存在值的冲突,但是对于 FullSpan 是存在多个节点的覆盖。
实际上使用 Span 转换字符串和使用 FullSpan 转换字符串的方法就和使用 ToString 差不多,请看 Roslyn NameSyntax 的 ToString 和 ToFullString 的区别
边栏推荐
- Almost all known protein structures in the world are open sourced by DeepMind
- [in-depth study of 4 g / 5 g / 6 g project - 50] : URLLC - 16 - the 3 GPP URLLC agreement, specification, technical principle of depth interpretation - 10 - high reliability technology - 1 - low codin
- JCMsuite Application: Oblique Plane Wave Propagation Transmission Through Aperture
- 【北亚数据恢复】IBM System Storage存储lvm信息丢失数据恢复方案
- Technology sharing | Mini program realizes audio and video calls
- [深入研究4G/5G/6G专题-50]: URLLC-16-《3GPP URLLC相关协议、规范、技术原理深度解读》-10-高可靠性技术-1-低编码率编码调制方案MCS与高可靠性DRB
- C# 局部函数与事件
- Find My Technology | Prevent your pet from getting lost, Apple Find My technology can help you
- 7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇
- How to fall in love with a programmer
猜你喜欢

理论篇1:深度学习之----LetNet模型详解

【Web技术】1401- 图解 Canvas 入门

I/O stream summary

Technology sharing | Description of the electronic fence function in the integrated dispatching system

Cisco-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
![[LeetCode] 38. Appearance sequence](/img/d6/092796b57844d5d30f3ed123a1b98a.png)
[LeetCode] 38. Appearance sequence

【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常

【Today in History】August 4: First female Turing Award winner; NVIDIA acquires MediaQ; first Cybersecurity Challenge completed

技术分享| 融合调度系统中的电子围栏功能说明

数据库恢复
随机推荐
Why does the decimal point appear when I press the space bar in word 2003?
leetcode:253. 至少需要多少间会议室
This week to discuss the user experience: Daedalus Nemo to join Ambire, explore the encryption of the ocean
Hangzhou electric the competition team arrangement (ACM)
快解析结合友加畅捷U+
基于 Next.js实现在线Excel
leetcode:212. 单词搜索 II
xampp安装包含的组件有(php,perl,apche,mysql)
1403. 非递增顺序的最小子序列
How to Identify Asynchronous I/O Bottlenecks
Technology sharing | Mini program realizes audio and video calls
Google plug-in. Download contents file is automatically deleted after solution
Rust from entry to proficient 04-variables
Problem solving-->Online OJ (18)
Find My Technology | Prevent your pet from getting lost, Apple Find My technology can help you
using关键字学习
谷歌插件.crx文件下载后被自动删除的解决方法
技术分享| 小程序实现音视频通话
理论篇1:深度学习之----LetNet模型详解
Theory 1: Deep Learning - Detailed Explanation of the LetNet Model