如何在C#中重新定义标准关键字的名称

时间:2013-03-04 08:51:36

标签: c# c-preprocessor

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

我认为必须看起来像这样:

namespace
{
   #define MyIf = if;
   #define MyElse = else;
   ...

   public someclass
   {
        public void someMethod()
        {
            MyIf(true)
            {
               ...
            }
            MyElse
            {
               ...
            }
        }
   }
}

加了:

也许有办法如何制作C ++或 C 库,它将重新定义C#的标准核心部分?

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

7 个答案:

答案 0 :(得分:5)

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

即使有可能,恐怖比例也只比Cthulhu低一步。

答案 1 :(得分:3)

在c#中,您可以在此处覆盖可重载的运算符( + - == )更多信息:http://msdn.microsoft.com/en-us/library/8edha89s(v=vs.80).aspx < / p>

但是不能真正覆盖条件运算符。

对于这些运算符=,。,?:, - &gt;,new,is,sizeof,typeof也是如此,它们不能重载。

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

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

答案 2 :(得分:2)

您可以将 Monads extension methods 一起使用......

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

答案 3 :(得分:1)

您无法重新定义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

答案 4 :(得分:1)

C##define

  

#define允许您定义符号,这样,通过使用符号作为传递给#if指令的表达式,表达式将计算为true。

C#没有preprocessor,但它有相似的指令:

  

虽然编译器没有单独的预处理器,但本节中描述的指令将被处理,就像有一个指令一样。它们用于帮助进行条件编译。 与C和C ++指令不同,您不能使用这些指令来创建宏

因此它与C ++或C中的#define不同.C ## define仅指出存在文字,但该文字没有替换或宏。

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

C ++ #define

  

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

答案 5 :(得分:0)

在C#中,预处理器指令用于有条件编译代码。

For example:

  

#define可让您定义符号。当您使用符号作为传递给#if指令的表达式时,表达式将   评价为真。

答案 6 :(得分:0)

执行类似于您想要的操作,您可以覆盖隐式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");
        }
    }
}