索引
- Roslyn Analyzers
- Code Review
- 自动 Code Review 案例
- 1.public、internal权限的字段建议以大写字母开头。
- 2.private、protected权限的字段建议以下划线+小写字母开头。
- 3.不建议直接继承 MonoBehaviour,建议继承至 HTBehaviour。
- 4.不建议使用 Input 判断输入或获取鼠标位置,建议使用 Main.m_Input 替代。
- 5.不建议在 Update、FixedUpdate、OnUpdateFrame 等帧执行方法中调用 GetComponent 方法,建议将组件缓存。
- 6.多个字符串串联(3个或以上)建议使用【$语法】或【string.Format】或【StringBuilder】替代。
- 7.float类型不建议使用 == 判断相等,建议使用 Mathf.Approximately 判断约等。
- 8.类必须添加XML文档注释。
- 9.public、internal权限的方法必须添加XML文档注释。
- 反馈至Unity编辑器
- 实现步骤
- 开发环境
- 一、新建VS工程
- 二、管理NuGet程序包
- 三、安装Microsoft.CodeAnalysis.CSharp包
- 四、编写分析器程序
- 1.新建类DiagnosticAnalyzer01
- 2.实现抽象方法
- 3.编写分析器代码
- 4.生成解决方案
- 五、使用分析器程序
- 1.浏览dll
- 2.拷贝dll
- 3.设置dll
- 4.新建一个脚本
- 六、总结
Roslyn Analyzers
Roslyn Analyzers
是.NET编译平台的代码分析程序,用以检查 C# 或 Visual Basic 代码的样式、质量、可维护性、设计及其他问题。
Code Review
虽然人工Code Review
能检查出100%(取决于Reviewer的水平)的代码问题,但很多简单明了的设计或性能上的优化改进意见,我们依然想要它在程序员编码时便实时提醒出来,所以我们需要自动Code Review
。
自动 Code Review 案例
例如,目前我们的自动Code Review
系统包含但不仅限于如下这些案例:
1.public、internal权限的字段建议以大写字母开头。
ID:D0001
类型:Design(设计改进意见)
级别:警告(不影响程序执行)
2.private、protected权限的字段建议以下划线+小写字母开头。
ID:D0002
类型:Design(设计改进意见)
级别:警告(不影响程序执行)
3.不建议直接继承 MonoBehaviour,建议继承至 HTBehaviour。
ID:D0007
类型:Design(设计改进意见)
级别:警告(不影响程序执行)
4.不建议使用 Input 判断输入或获取鼠标位置,建议使用 Main.m_Input 替代。
ID:O0001
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
5.不建议在 Update、FixedUpdate、OnUpdateFrame 等帧执行方法中调用 GetComponent 方法,建议将组件缓存。
ID:O0002
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
6.多个字符串串联(3个或以上)建议使用【$语法】或【string.Format】或【StringBuilder】替代。
ID:O0003
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
7.float类型不建议使用 == 判断相等,建议使用 Mathf.Approximately 判断约等。
ID:O0004
类型:Optimize(代码优化意见)
级别:警告(不影响程序执行)
8.类必须添加XML文档注释。
ID:F0001
类型:Force(强制规范)
级别:错误(编译级错误,影响程序执行)
9.public、internal权限的方法必须添加XML文档注释。
ID:F0002
类型:Force(强制规范)
级别:错误(编译级错误,影响程序执行)
反馈至Unity编辑器
自动Code Review
会以其对应的级别(警告还是错误)同步反馈至Unity编辑器的Console
窗口,如果是错误
级别,则编辑器将无法播放,必须解决掉该优化改进意见。
实现步骤
开发环境
- Visual Studio 2022(社区版)
- Unity 2022.3.17
一、新建VS工程
新建一个VS工程,模板为类库(且为面向.NET Standard,以兼容Unity)
,工程名称为CodeReview
:
二、管理NuGet程序包
鼠标右击解决方案,选择管理NuGet程序包
:
三、安装Microsoft.CodeAnalysis.CSharp包
搜索并安装Microsoft.CodeAnalysis.CSharp
包,3.8.0版本(Unity官方文档要求为该版本)
:
四、编写分析器程序
1.新建类DiagnosticAnalyzer01
新建类DiagnosticAnalyzer01
,继承至DiagnosticAnalyzer
:
namespace CodeReview
{public class DiagnosticAnalyzer01 : DiagnosticAnalyzer{}
}
2.实现抽象方法
实现该类的抽象方法:(该类将用于实现一个检测类名不能过短的分析器)
namespace CodeReview
{/// <summary>/// T001:类名定义不能过短。/// </summary>[DiagnosticAnalyzer(LanguageNames.CSharp)]public class DiagnosticAnalyzer01 : DiagnosticAnalyzer{public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => throw new NotImplementedException();public override void Initialize(AnalysisContext context){context.EnableConcurrentExecution();context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);//注册类定义语法回调context.RegisterSyntaxNodeAction(OnSyntaxNodeAction, SyntaxKind.ClassDeclaration);}//当任意类定义语法编译时,将回调此方法private void OnSyntaxNodeAction(SyntaxNodeAnalysisContext context){}}
}
3.编写分析器代码
接下来就是在回调方法中编写分析器代码:
namespace CodeReview
{/// <summary>/// T001:类名定义不能过短。/// </summary>[DiagnosticAnalyzer(LanguageNames.CSharp)]public class DiagnosticAnalyzer01 : DiagnosticAnalyzer{public DiagnosticDescriptor Rule{get{if (_descriptor == null){_descriptor = new DiagnosticDescriptor("T001","类名定义不能过短。","类名定义不能过短。","Test",DiagnosticSeverity.Error,true);}return _descriptor;}}public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);private DiagnosticDescriptor _descriptor;public override void Initialize(AnalysisContext context){context.EnableConcurrentExecution();context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);context.RegisterSyntaxNodeAction(OnSyntaxNodeAction, SyntaxKind.ClassDeclaration);}private void OnSyntaxNodeAction(SyntaxNodeAnalysisContext context){ClassDeclarationSyntax classDeclaration = (ClassDeclarationSyntax)context.Node;//发现类名过短if (classDeclaration.Identifier.ToString().Length <= 3){//上报分析器context.ReportDiagnostic(Diagnostic.Create(Rule, classDeclaration.Identifier.GetLocation()));}}}
}
4.生成解决方案
鼠标右击解决方案,选择生成
:
此时,我们的分析器:T001:类名定义不能过短
就编写完成了。
五、使用分析器程序
1.浏览dll
鼠标右击解决方案,选择在文件资源管理器中打开文件夹
:
2.拷贝dll
进入bin/Debug/netstandard2.0
目录,将CodeReview.dll
拖拽到任意Unity编辑器中的任意Editor
目录下:
3.设置dll
选中CodeReview.dll
,设置为下图的导入设置:
4.新建一个脚本
此时就可以新建一个脚本进行测试了,我们新建脚本T1
,如果不出意外,你将收获一个错误提示:
六、总结
如上,一个测试分析器程序便开发完成了,如果你能熟悉语法分析,我想你应该知道,在分析器程序中,你将无所不能。