C# 在构建过程中替换代码部件,就像在c+中定义的旧代码一样+;做

C# 在构建过程中替换代码部件,就像在c+中定义的旧代码一样+;做,c#,operator-overloading,operators,C#,Operator Overloading,Operators,我们正在寻找一种向解决方案中添加NOT运算符的方法。不幸的是,C#不支持新的操作符,所以我们不能仅仅添加NOT作为新操作符 接下来我们想到的是实现一个静态方法NOT()。但目前,C#不支持使用Namespace.StaticTypeName;(至少我们还没有弄明白)-这就是为什么我们必须一直写下这个愚蠢的类名 然后我们终于有了用NOT替换NOT的想法-接线员,每次我们建立解决方案。。。类似于C++中的优秀的旧定义。 在C#中可能吗?在C#中没有预处理,因此您不能使用#定义来满足您的需要 您可以尝

我们正在寻找一种向解决方案中添加NOT运算符的方法。不幸的是,C#不支持新的操作符,所以我们不能仅仅添加NOT作为新操作符

接下来我们想到的是实现一个静态方法NOT()。但目前,C#不支持使用Namespace.StaticTypeName;(至少我们还没有弄明白)-这就是为什么我们必须一直写下这个愚蠢的类名

然后我们终于有了用NOT替换NOT的想法-接线员,每次我们建立解决方案。。。类似于C++中的优秀的旧定义。
在C#中可能吗?

在C#中没有预处理,因此您不能使用#定义来满足您的需要

您可以尝试使用以下扩展方法:

public static T Not<T>(this T) {
    // your logic here
    return ...
}
... || myvar.Not() + ...
public static class Extensions
{
    public static bool NOT(this object ignored, bool flag)
    {
        return !flag;
    }
}

这样,在声明扩展方法的地方不需要使用类名,但仍然需要使用MyNamespace添加
,用于包含扩展方法声明的类的命名空间。

C#中没有预处理,因此您不能使用#定义来实现所需的功能

您可以尝试使用以下扩展方法:

public static T Not<T>(this T) {
    // your logic here
    return ...
}
... || myvar.Not() + ...
public static class Extensions
{
    public static bool NOT(this object ignored, bool flag)
    {
        return !flag;
    }
}

这样,在声明扩展方法的地方不需要使用类名,但仍然需要使用MyNamespace添加
用于包含扩展方法声明的类的命名空间。

在注释中进行了一些澄清之后,我觉得您走错了路


请不要试图为像
这样的琐碎操作创建函数。这不仅会使您的代码中出现一些新人不理解的内容,而且如果该方法没有内联,还会降低您的性能。

在注释中进行了一些澄清之后,我觉得您走错了路


请不要试图为像
这样的琐碎操作创建函数。这不仅会使您的代码中出现一些新人不懂的内容,而且如果该方法没有内联,还会降低您的性能。

扩展方法是一种很好的方法:

public static class Extensions
{
    public static bool NOT(this bool flag)
    {
        return !flag;
    }
}
因此,无论您在代码中的什么位置,都可以调用someBool.NOT()

如果您绝对希望只能将其称为NOT(someBool),请按如下方式操作:

public static T Not<T>(this T) {
    // your logic here
    return ...
}
... || myvar.Not() + ...
public static class Extensions
{
    public static bool NOT(this object ignored, bool flag)
    {
        return !flag;
    }
}

扩展方法是一种很好的方法:

public static class Extensions
{
    public static bool NOT(this bool flag)
    {
        return !flag;
    }
}
因此,无论您在代码中的什么位置,都可以调用someBool.NOT()

如果您绝对希望只能将其称为NOT(someBool),请按如下方式操作:

public static T Not<T>(this T) {
    // your logic here
    return ...
}
... || myvar.Not() + ...
public static class Extensions
{
    public static bool NOT(this object ignored, bool flag)
    {
        return !flag;
    }
}

不能在普通的旧C#中进行预处理

但是,如果您愿意创建“您自己的C#”,您可以使用在编译语法树之前在语法树上进行转换

这一转变的一个例子可以在中看到

但是,我建议不要使用这种做法:它会使您的代码对除您自己的团队之外的几乎所有人都不可读,使您的构建过程更加复杂,需要对您添加到团队中的人员进行特定的培训,并且可能会破坏大多数静态分析器


您还可以通过以下操作获得结果:

您不能在普通的旧C#中进行预处理

但是,如果您愿意创建“您自己的C#”,您可以使用在编译语法树之前在语法树上进行转换

这一转变的一个例子可以在中看到

但是,我建议不要使用这种做法:它会使您的代码对除您自己的团队之外的几乎所有人都不可读,使您的构建过程更加复杂,需要对您添加到团队中的人员进行特定的培训,并且可能会破坏大多数静态分析器


您还可以通过以下操作实现您的结果:

正如您所注意到的,您不能在C#中创建新的运算符。NET确实公开了编译器类,所以您可以在处理这些值之前滚动自己的编译器来替换这些值

如果您想继续遵守C#,那么Lanorkin shared的扩展方法解决方案可能是最好的。另一个“解决方案”是一个无命名空间的静态
Not
类:

public struct Not
{
    public Not(bool value)
        : this()
    {
        NotValue = !value;
    }

    public bool NotValue
    {
        get;
        private set;
    }

    public static implicit operator bool(Not value)
    {
        return value.NotValue;
    }
}

bool trueValue = new Not(false);
对于你的新员工来说,这也将清楚地表明接线员是新员工,而不是C#1

您的整个团队是否认为感叹号会影响可读性?他们都有良好的C++背景吗?您的
if
语句有多大?您是否考虑过交换
if
else
部分,以减少
not
的需要


如果我开始为贵公司工作,我需要几个月才能忘记这个感叹号。

正如您所注意到的,您不能在C#中创建新的运算符。NET确实公开了编译器类,所以您可以在处理这些值之前滚动自己的编译器来替换这些值

如果您想继续遵守C#,那么Lanorkin shared的扩展方法解决方案可能是最好的。另一个“解决方案”是一个无命名空间的静态
Not
类:

public struct Not
{
    public Not(bool value)
        : this()
    {
        NotValue = !value;
    }

    public bool NotValue
    {
        get;
        private set;
    }

    public static implicit operator bool(Not value)
    {
        return value.NotValue;
    }
}

bool trueValue = new Not(false);
对于你的新员工来说,这也将清楚地表明接线员是新员工,而不是C#1

您的整个团队是否认为感叹号会影响可读性?他们都有良好的C++背景吗?您的
if
语句有多大?您是否考虑过交换
if
else
部分,以减少
not
的需要


如果我开始为贵公司工作,我需要几个月才能忘记感叹号。

C#确实支持运算符重载。你能说得更具体些吗?也许是语法示例?只使用
有什么不对操作员?这对我来说似乎更明智。我很高兴你不能直接用C语言来实现你的建议。如果你想要更详细的语言,你可以使用VB。它内置了
而不是
。也许你应该澄清你试图解决的问题,因为它并不十分清楚