我有一个有趣的想法。我想在C#中重新定义关键字,例如将if
关键字替换为MyIf
或其他内容。有人知道怎么做吗?
我认为必须看起来像这样:
namespace
{
#define MyIf = if;
#define MyElse = else;
...
public someclass
{
public void someMethod()
{
MyIf(true)
{
...
}
MyElse
{
...
}
}
}
}
加了:
也许有办法如何制作C ++或 C 库,它将重新定义C#的标准核心部分?
**的通知。我知道这是糟糕的编程习惯,我要求所有程序员不要在企业代码中使用答案。 **
答案 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 。
答案 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)
您无法重新定义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
答案 4 :(得分:1)
#define允许您定义符号,这样,通过使用符号作为传递给#if指令的表达式,表达式将计算为true。
C#没有preprocessor,但它有相似的指令:
虽然编译器没有单独的预处理器,但本节中描述的指令将被处理,就像有一个指令一样。它们用于帮助进行条件编译。 与C和C ++指令不同,您不能使用这些指令来创建宏。
因此它与C ++或C中的#define不同.C ## define仅指出存在文字,但该文字没有替换或宏。
#define STRING int // Valid in C++ but invalid in C#
#define指令将token-string替换为源文件中所有后续出现的标识符。只有在形成令牌时才会替换标识符。 (请参阅C ++语言参考中的C ++标记。)例如,如果标识符出现在注释中,字符串中或作为较长标识符的一部分,则不会替换标识符。
答案 5 :(得分:0)
答案 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");
}
}
}