【问题标题】:Is there a programmatic way to identify .Net reserved words? [closed]是否有一种编程方式来识别.Net 保留字? [关闭]
【发布时间】:2016-09-28 23:37:32
【问题描述】:

我正在寻找在 VS 2015 中以编程方式阅读 .Net、C# 保留关键字。

我得到了在 [link][1] 中阅读 C# 保留字的答案。

CSharpCodeProvider cs = new CSharpCodeProvider();
var test = cs.IsValidIdentifier("new"); // returns false
var test2 = cs.IsValidIdentifier("new1"); // returns true

但是对于vardynamicListDictionary 等,上面的代码返回错误的结果。

有没有办法在运行时识别 .net 关键字,而不是在列表中列出关键字?

string[] _keywords = new[] { "List", "Dictionary" };

【问题讨论】:

  • 只是因为我很好奇。你为什么需要这个? :D
  • 看起来很像XY Problem。这解决了您未描述的其他一些问题。
  • 我认为您的意思是 C# 而不是 .NET。
  • 你到底是什么意思? vardynamicList 都不是 keywords。请解释您的问题。
  • 列表/字典不是 C# 中的关键字。

标签: c# .net reserved-words


【解决方案1】:

这是一个完美的 C# 程序:

using System;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            int var = 7;
            string dynamic = "test";
            double List = 1.23;

            Console.WriteLine(var);
            Console.WriteLine(dynamic);
            Console.WriteLine(List);
        }
    }
}

所以你的前提是错误的。您可以在短名单中查找keywords。仅仅因为某事有意义并不意味着它以任何方式“保留”。

不要让在线语法高亮让您感到困惑。如果您想看到正确的突出显示,请将其复制并粘贴到 Visual Studio 中。

【讨论】:

  • 更疯狂的是,您可以添加一个名为 var 的类型,然后使用它来代替类型推断。
  • @CodesInChaos 这并不疯狂 - 它完全符合设计。 C# 的每个后续版本都需要与以前的版本保持向后兼容,因此在 C# 2.0 中有效的任何代码在 C# 3.0 中必须仍然有效。这就是 async 存在的原因,例如 - 这是确保 await 不会在新编译器中编译的旧代码中被误解的最佳方式。添加 async 后,您有责任解决任何冲突。
  • @Luaan:这是一个非常明智的语言设计选择,但它却是非常疯狂的用户行为。语言设计者必须想出在面对疯狂的用户行为时稳健的设计。
【解决方案2】:

正如 nvoigt 所解释的,您以编程方式确定字符串是否为关键字的方法实际上是正确的。要完整,(检查反射器后)它应该是:

bool IsKeyword(string s)
{
    var cscp = new CSharpCodeProvider();
    return s != null
           && CodeGenerator.IsValidLanguageIndependentIdentifier(s)
           && s.Length <= 512
           && !cscp.IsValidIdentifier(s);
}

(VB.NET 版本需要 1023 并检查“_”。)

【讨论】:

  • IsKeyword(string s) 正在工作,但仅适用于 C# 关键字。而且我看起来更像列表,字典等单词也应该被我的程序识别。
  • @DSP 在这种情况下,您还想枚举您正在考虑的命名空间中的所有公共类型,或者每次查找,枚举您正在考虑的所有命名空间并检查非-null 结果来自Type.GetType(ns+Type.Delimiter+s)..
  • 感谢 Mark,对于我在命名空间中所有可用类型中验证的类型。 C# 关键字我使用的是 CSharpCodeProvider.IsValidIdentifier,但是C# Contextual Keywords 没有验证高于两个的低谷。
  • 我上面的评论并不完全正确。 Type.GetType 只会返回位于“当前执行的程序集或 Mscorlib.dll”中的类型,除非您提供程序集限定名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多