Как изменить имена стандартных ключевых слов в C#
у меня есть интересная идея. Я хочу переопределить ключевые слова в C#, например заменить if
ключевые слова MyIf
или что-то еще. Кто-нибудь знает, как это сделать?
как я думаю, это должно выглядеть примерно так:
namespace
{
#define MyIf = if;
#define MyElse = else;
...
public someclass
{
public void someMethod()
{
MyIf(true)
{
...
}
MyElse
{
...
}
}
}
}
добавлено:
может быть, есть способ, как сделать на C++ или C библиотека, которая переопределит часть стандартного ядра C#?
**обратите внимание. Я знаю, что это плохой практикой программирования, и я прошу всех программистов не использовать ответ в ваш ОКПО. **
7 ответов
Это невозможно -- C# не имеет препроцессора, такого как C и C++, поэтому нет механизма преобразования источника до того, как компилятор его увидит. И, конечно же, компилятор распознает только стандарт if
, поэтому нет и другого варианта, который каким-то образом преобразует источник до того, как компилятор его увидит.
в c# вы можете переопределить перегружаемые операторы (+ , - , ==) дополнительная информация здесь:http://msdn.microsoft.com/en-us/library/8edha89s (v=против 80).aspx
а вы Не могу действительно переопределить условные операторы.
то же самое касается этих операторов =, ., ?:,- > , new, is, sizeof, typeof, они не могут быть перегружены.
C# не поддерживает макросы, но, конечно, вы можете написать пользовательский парсер, который обрабатывает макросы перед отправкой кода компилятору c#, взгляните на Microsoft Roslyn для этого.
можно использовать монады С extension methods
вот так...
это монада может быть
public static TInput If<TInput>(this TInput o, Predicate<TInput> evaluator)
where TInput : class
{
if (o == null) return null;
return evaluator(o) ? o : null;
}
public static TResult Return<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator, TResult failureValue)
where TInput : class
{
if (o == null) return failureValue;
return evaluator(o);
}
// использование
var result = ListOfObjects.If(o => o.Id == 1).Return(x => x.Object, null);
вы не можете переопределить if
или else
, потому что у C# нет препроцессора, который позволил бы вам сделать что-то подобное (вероятно, также, чтобы предотвратить подобные вещи).
но вы можете переопределить, когда экземпляры ваших классов оцениваются в true
/false
(это самое близкое, что вы можете получить):
public static bool operator true(YourType x)
{
return x.IsLying ? !x.Whatever : x.Whatever;
}
public static bool operator false(YourType x)
{
return x.IsLying ? x.Whatever : !x.Whatever;
}
пример:
YourType wah = new YourType() { IsLying = true, Whatever = true };
if (wah) {
// ...
}
else {
// ...
}
Подробнее см. здесь подробности:
http://msdn.microsoft.com/en-us/library/6x6y6z4d.aspx
C# #define
#define позволяет определить символ, такой, что, используя символ в качестве выражения, переданного директиве #if, выражение будет равно true.
C# не имеет препроцессора, но он так и директивы:
хотя компилятор не имеет отдельного препроцессора, директивы, описанные в этом разделе, обрабатываются так, как если бы быть одним. Они используются для помощи в условной компиляции. в отличие от директив C и c++, вы не можете использовать эти директивы для создания макросов.
таким образом, это не то же самое #define как в C++ или C. C# #define только состояния, что существует литерал, но нет замены или макроса для этого литерала.
#define STRING int // Valid in C++ but invalid in C#
C++ #define
директива #define заменяет токен-строку для всех последующие вхождения идентификатора в исходный файл. Идентификатор заменяется только тогда, когда он формирует токен. (См. раздел маркеры C++ в Справочнике по языку C++.) Например, идентификатор не заменяется, если он появляется в комментарии, в строке или как часть более длинного идентификатора.
В C# директивы препроцессора существуют для условно-компиляции кода.
#define
позволяет определить символ. При использовании символа в качестве выражения, которое передается в
сделайте что-то похожее на то, что вы хотите, вы можете переопределить неявный оператор bool:
using System;
class PleaseDontDoThis {
public static implicit operator bool(PleaseDontDoThis h) {
return (new Random().Next() % 2 == 0);
}
}
static class Program {
static void Main(string[] args) {
var x = new PleaseDontDoThis();
if (x) {
Console.WriteLine("true");
} else {
Console.WriteLine("false");
}
}
}