12

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

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

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

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

添加:

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

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

4

7 回答 7

5

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

就算有可能,在恐怖规模上也只比克苏鲁低了一步。

于 2013-03-04T08:54:45.557 回答
3

在 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

于 2013-03-04T08:57:29.390 回答
2

你可以像这样使用Monads ...extension methods

这是 Monad 也许

    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);
于 2013-03-04T09:09:31.703 回答
1

你不能重新定义ifor 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

于 2013-03-04T08:56:58.093 回答
1

C##定义

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

C# 没有预处理器,但它有类似的指令:

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

因此,它与 C++ 或 C 中的 #define 不同。C# #define 仅声明存在一个文字,但该文字没有替换或宏。

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

C++ #定义

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

于 2013-03-04T09:00:25.863 回答
0

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

例如:

#define 让您定义一个符号。当您使用符号作为传递给#if指令的表达式时,表达式的计算结果为真。

于 2013-03-04T08:59:22.957 回答
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");
        }
    }
}
于 2013-03-04T09:00:25.670 回答