C# 如何在VisualStudio中禁用创建非英语文本变量
现在,我可以在VS2017中写道:C# 如何在VisualStudio中禁用创建非英语文本变量,c#,.net,C#,.net,现在,我可以在VS2017中写道: var какаяТоНепонятнаяПеременная = "some variable value here"; VS2017已成功编译。 我想允许只使用英文字母表中的字母来编写变量名。我不知道如何快速将代码注入编译器进程以强制生成失败,但这在理论上是可行的。我可以建议的是一种基于Roslyn的单元测试解决方案。起点将是安装nuget软件包。其思想是加载一个解决方案,然后加载一个要扫描的项目(使用MSBuildWorkSpaceapi)并遍历所有文
var какаяТоНепонятнаяПеременная = "some variable value here";
VS2017已成功编译。
我想允许只使用英文字母表中的字母来编写变量名。我不知道如何快速将代码注入编译器进程以强制生成失败,但这在理论上是可行的。我可以建议的是一种基于
Roslyn
的单元测试解决方案。起点将是安装nuget软件包。其思想是加载一个解决方案,然后加载一个要扫描的项目(使用MSBuildWorkSpace
api)并遍历所有文档(文件)。您询问了验证变量名的问题,因此这意味着您需要检测SyntaxTree
中的IdentifierNameSyntax
项,但这不是唯一可以检测到的内容-MethodDeclarationSyntax
,ClassDeclarationSyntax
等也可以检测到。示例代码如下:
[Test]
public async Task Verify_ProjectDoesNotHaveNonASCIICharacters()
{
var project = workspace.CurrentSolution.Projects.Single(p => p.Name == "csproj_name");
foreach (var document in project.Documents)
{
var semanticModel = await document.GetSemanticModelAsync();
foreach (var item in semanticModel.SyntaxTree.GetRoot().DescendantNodes())
{
switch (item)
{
// you may catch other Syntax types for methods, class names for example
case IdentifierNameSyntax identifierName:
Assert.IsFalse(ContainsUnicodeCharacter(identifierName.Identifier.Text), $"Variable {identifierName.Identifier.Text} in {document.Name} contains non ASCII characters");
break;
}
}
}
}
ASCII字符检查可以改进,但为了节省时间,我使用了中的代码:
private bool ContainsUnicodeCharacter(string input)
{
const int MaxAnsiCode = 255;
return input.Any(c => c > MaxAnsiCode);
}
设置MSBuildWorkspace的一些示例代码:
var workspace = MSBuildWorkspace.Create();
await workspace.OpenSolutionAsync("...your_path/solution.sln");
定义“英语”。如果变量名是
ghrborpf
,该怎么办?那是“英语”吗?@大卫,是的。我只允许使用英文字母表中的字符。这个问题只针对字符,var ghrborpf123是可以的。理论上,roslyn
可以做到这一点,但我不知道任何细节。它们是有效的unicode字符,所以我认为您不能阻止编译器使用它们。您可能还需要允许ux、0-9,或者$。而且,如果您使用任何类型的代码生成或第三方库,请允许它们使用任何东西,至少在您可能使用它们创建新变量的地方。代码生成的一个领域是应用程序设置,但您可能可以控制它。也许拼写检查方法会起作用,但你必须允许批准许多行话和首字母缩略词。请通过Unicode的各种子集来调用它,因为所有C#代码都是Unicode字符。ASCII不转到255,ANSI不是ASCII。(因为您正在测试char
[UTF-16代码单元]嘿@TomBlodget。我同意,我在帖子中提到验证应该改进。我觉得问题更多的是验证机制,而不是如何过滤掉characters@Artem解决方案工作正常,但它不适用于.net核心应用程序,因为Microsoft.CodeAnalysis.Workspace.MSBuild nuget包不可用不使用。netCoreApp:(谢谢!!!