如何避免在 C# 中的每个数学函数前面使用 "Math."?

How to avoid "Math." in front of every math function in C#?

我正在编写一些数学方面的 C#。许多行依次使用大量 abs()、min()、max()、sqrt() 等。使用 C# 是简单的正常方法,我必须在每个函数前加上 "Math." 例如

double x = Math.Min(1+Math.Sqrt(A+Math.Max(B1,B2)),
           Math.Min(Math.Cos(Z1),Math.Cos(Z2)));

我宁愿像 C:

那样编写代码
double x = min(1+sqrt(A+max(B1,B2)), min(cos(Z1), cos(Z2)));

对于科学家和工程师来说,这更容易阅读并且看起来更自然。正常的 C# 方式将好的部分隐藏在 "Math."

的迷雾中

在 C# 中有没有办法做到这一点?

经过一番谷歌搜索后,我找到了一个让我尝试的例子

using min = Math.Min;
...
double x = min(a,b);        

但是 "using" 语句产生了一个错误,"System.Math.Min(decimal,decimal) is a method but is used like a type" 但除此之外这看起来是一个很好的解决方案。 (无论如何,'decimal' 是什么?)

如果你真的那么在乎,你可以自己写方法

private int min(int a, int b)
{
    return Math.Min(a, b);
}

如果您有雄心壮志,可以考虑 generics


此外,如果您想提高清晰度,可以为每个 有意义的 部分创建一个新的 描述性 变量,而不是您的表达式,而不是内联处理所有内容。

double piece2 = 1+Math.Sqrt(A+Math.Max(B1,B2));
double piece1 = Math.Min(Math.Cos(Z1),Math.Cos(Z2))
double x = min(piece1, piece2);

我将事物命名为 piece2piece2 的唯一原因是因为我实际上并不知道您的表达式应该计算什么。实际上,您应该使用更有意义的名称,例如 velocityincomeTaxPercentage

下一版本的 C# 中将提供此功能。请参阅静态 Using 语句 here

你不能这样做。至少,在 C# 6 之前,您不能这样做。

如果你使用的是C#6,你可以这样写:

using static System.Math;

在文件的顶部,这将允许您在不使用类型名称的情况下访问其静态方法 (Math)。

"using" method 对编译器或语义没有任何意义,这就是你得到那个错误的原因。

最后 decimal 是另一种数字类型(如 double)。它只是在生成错误时选择了 Math.Min 的重载。

众多解决方案之一是在本地定义委托。代码

double x = Math.Min(1+Math.Sqrt(A+Math.Max(B1,B2)),
           Math.Min(Math.Cos(Z1),Math.Cos(Z2)));

可以重写为以下实现。

Func<double,double,double> min = Math.Min;
Func<double,double,double> max = Math.Max;
Func<double,double> sqrt = Math.Sqrt;
Func<double,double> cos = Math.Cos;
double x = min(1+sqrt(A+max(B1,B2)), min(cos(Z1), cos(Z2)));

由于 Math 是 class 而不是命名空间,因此您不能像往常一样使用它, 相反,你可以这样说:

使用静态 System.Math;

它适用于命名空间内的任何其他 class。