2016-05-31 3 views
15

Я ищу для чтения .Net, C# зарезервированные ключевые слова программно в VS 2015.Есть ли программный способ идентифицировать .Net зарезервированные слова?

Я получил ответ на чтение зарезервированных слов C# в [link] [1].

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

Но для var, dynamic, List, Dictionary и т.д. выше код возвращает неправильный результат.

Есть ли способ идентифицировать ключевые слова .net во время выполнения, а не перечислять ключевые слова в списке?

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

только потому, что я очень любопытный. Зачем тебе это нужно? : D –

+19

Это очень похоже на [XY Problem] (http://meta.stackexchange.com/a/66378). Это решает другую проблему, которую вы не описываете. –

+2

Я думаю, вы имеете в виду C# вместо .NET. –

ответ

32

Это прекрасно 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, если хотите увидеть правильное выделение.

+13

Даже более сумасшедший, вы можете добавить тип, называемый 'var', который затем используется вместо вывода типа. – CodesInChaos

+11

@CodesInChaos Это не сумасшедший - он точно так же разработан. Каждая последующая версия C# должна оставаться обратной совместимостью с предыдущими версиями, поэтому любой код, действительный в C# 2.0, должен оставаться верным в C# 3.0. Вот почему, например, существует 'async' - это был лучший способ убедиться, что' await' не ошибочно интерпретируется в старом коде, скомпилированном в новом компиляторе. Когда вы добавите 'async', ваша ответственность за устранение конфликтов. – Luaan

+0

@ 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 и проверка на "_".)

+0

IsKeyword (string s) работает, но только для ключевых слов C#. И я больше похожу на такие слова, как List, Dictioonary и т. Д., Также должна распознавать по моей программе. – DSP

+0

@DSP. В этом случае вы также должны перечислять все общедоступные типы в пространствах имен, которые вы рассматриваете, или каждый раз искать каждый раз, перечислять все пространства имен, которые вы рассматриваете, и проверять непустой результат из «Тип». GetType (ns + Type.Delimiter + s) '.. –

+0

Спасибо, Марк, для типов, которые я проверяю во всех типах, доступных в пространстве имен. Ключевые слова C# Я использую CSharpCodeProvider.IsValidIdentifier, но [Контекстные ключевые слова C#] (https://msdn.microsoft.com/en-us/library/the35c6y.aspx) не проверяют корыта выше двух. – DSP