Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在VisualStudio中禁用创建非英语文本变量_C#_.net - Fatal编程技术网

C# 如何在VisualStudio中禁用创建非英语文本变量

C# 如何在VisualStudio中禁用创建非英语文本变量,c#,.net,C#,.net,现在,我可以在VS2017中写道: var какаяТоНепонятнаяПеременная = "some variable value here"; VS2017已成功编译。 我想允许只使用英文字母表中的字母来编写变量名。我不知道如何快速将代码注入编译器进程以强制生成失败,但这在理论上是可行的。我可以建议的是一种基于Roslyn的单元测试解决方案。起点将是安装nuget软件包。其思想是加载一个解决方案,然后加载一个要扫描的项目(使用MSBuildWorkSpaceapi)并遍历所有文

现在,我可以在VS2017中写道:

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:(谢谢!!!