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++那样的预处理器,因此没有在编译器看到源代码之前转换源代码的机制。当然,编译器只会识别标准的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);
您不能重新定义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++指令不同,你不能使用这些指令来创建宏。
所以它与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");
}
}
}