Определение собственных ключевых слов и значений

Можно ли определить ключевые слова в С#?
Я имею в виду что-то вроде

public important Form newform;

где important будет новым ключевым словом. Это означало бы что-то вроде, например, если тип null при компиляции ошибки. Таким образом, пример приведет к ошибке. Пример без ошибки:

public important Form newform = form1;

Ответы

Ответ 1

Нет, компилятор не позволяет добавлять ключевые слова из коробки.

Это не значит, что вы не можете выполнить то, что хотите, но это будет не тривиально. Вам понадобится выполнить собственный анализ статического кода.

Рослин

Один из способов сделать это - через анализаторы кода .NET Compiler Services (Roslyn). Вы можете прочитать эту статью MSDN, чтобы начать: https://msdn.microsoft.com/en-us/magazine/dn879356.aspx, и вы получите что-то похожее на это:

введите описание изображения здесь

Это будет работать из Visual Studio, и вы можете создать хотя бы Предупреждения, я бы тоже принял Ошибки (или вам нужно включить "Обработать предупреждения как ошибки" ).

Поскольку вы хотите декларативно добавить проверку на определенные переменные, вам нужно использовать Attributes:

/// <summary> Indicate a variable must be given a value 
/// in the same line it declared </summary>
public class ImportantAttribute : Attribute {}

public class Program
{
   [Important]
   object thisShouldError;

   object thisIsFine;
}

Затем, когда вы пишете Analyzer, вам нужно проверить объявление переменной node, чтобы увидеть, украшено ли оно Important.

Если вы хотите, чтобы это работало на сервере сборки (или вне VS), вам может понадобиться сделать еще одну работу: Roslyn: загрузка рабочей области в консольном приложении, но не в msbuild задача

StyleCop

Самый простой способ - это, вероятно, использовать Code Analysis (т.е. StyleCop) для запуска наборов правил статического анализа против вашей базы кода:

введите описание изображения здесь

Вам нужно будет написать свой собственный набор правил, и я не знаю, даст ли Rule Sets верность, чтобы иметь возможность объявлять объявления переменных, которые вы хотите принудительно проверить, то есть я не знаю, если вы сможете смешать и сопоставить это:

public class Program
{
   [Important]
   object thisShouldError;

   object thisIsFine;
}

Fody

Другим подходом является использование инструмента слияния IL, такого как Fody, который позволяет вам манипулировать IL вашего приложения во время компиляции. AFAIK вы не можете напрямую генерировать ошибки компиляции, но вы можете добавить недопустимый IL, который, в свою очередь, приведет к ошибке времени компиляции.

Итак, на основе того же кода, что и выше, после компиляции с Fody вы получите код вроде:

public class Program
{
   [Important]
   object thisShouldError YouForgotToInitializeThisImportantVariable;

   object thisIsFine;
}

Пользовательский компилятор

Microsoft открыла исходный код компилятора С#: https://github.com/dotnet/roslyn. Поэтому, если вы чувствуете себя очень амбициозно, вы можете абсолютно добавить свои собственные ключевые слова в свою собственную вилку компилятора. Конечно, вы, по сути, будете иметь свой собственный язык, и он не сможет скомпилировать ничего, кроме вашего настраиваемого компилятора.

Ответ 3

Короткие: Нет, вы не можете.

Long: Возможно, но это, вероятно, никогда не происходит, так как вам потребуется добавить команду С#, но для этого потребуется много обсуждений и много практических применений для он.

Ответ 4

Возможно, вы можете просто использовать такие инструменты, как ReSharper... Определение нового ключевого слова только для поиска неинициализированных общедоступных переменных звучит как плохая идея.