c预处理器-如何重新定义c#中标准关键字的名称

本文关键字:标准 关键字 定义 处理器 预处理 何重新 | 更新日期: 2023-09-27 18:02:17

我有一个有趣的想法。我想重新定义c#中的关键字,比如将if关键字替换为MyIf或其他东西。有人知道怎么做吗?

我认为它应该是这样的:

namespace
{
   #define MyIf = if;
   #define MyElse = else;
   ...
   public someclass
   {
        public void someMethod()
        {
            MyIf(true)
            {
               ...
            }
            MyElse
            {
               ...
            }
        }
   }
}

补充道:

也许有一种方法可以使c++或C库重新定义c#的标准核心部分?

* *通知。我知道这是糟糕的编程实践,我要求所有程序员不要在企业代码中使用这个答案。* *

c预处理器-如何重新定义c#中标准关键字的名称

这是不可能的——c#没有像C和c++那样的预处理器,因此没有在编译器看到源代码之前转换源代码的机制。当然,编译器只会识别标准的if,所以也没有其他的选择,在编译器看到它之前以某种方式转换源代码。

即使这是可能的,它在恐怖程度上也只比克苏鲁低一级。

在c#中可以重写可重载的操作符(+-==)更多信息请访问:http://msdn.microsoft.com/en-us/library/8edha89s(v=vs.80).aspx

但是不能真正覆盖条件操作符。

这些操作符=、。、?:、->、new、is、sizeof、typeof也一样,它们不能被重载。

c#不支持宏,但当然你可以在最终将代码发送到c#编译器之前编写一个自定义解析器来处理宏,看看Microsoft Roslyn

http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx

您可以像这样使用Monads extension methods

this is Monad Maybe

    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);

您不能重新定义ifelse,因为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++指令不同,你不能使用这些指令来创建宏

所以它与c++或C中的#define不同。c# define只声明存在一个文字,但没有替代或宏。

#define STRING int // Valid in C++ but invalid in C#

c++ # define

#define指令用token-string替换源文件中所有后续出现的标识符。标识符只有在形成令牌时才会被替换。(参见《c++语言参考》中的c++ token。)例如,如果标识符出现在注释中、字符串中或作为较长的标识符的一部分,则不会被替换。

在c#中,预处理器指令是为条件编译代码而存在的。

例如:

#define允许你定义一个符号。当您使用该符号作为传递给#if指令的表达式时,该表达式将求值为true

做类似的事情,您可以覆盖隐式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");
        }
    }
}