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

Dar*_*enW 4 c# readability using simplify

我正在写一些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)));
Run Code Online (Sandbox Code Playgroud)

我宁愿像C一样编写代码:

double x = min(1+sqrt(A+max(B1,B2)), min(cos(Z1), cos(Z2)));
Run Code Online (Sandbox Code Playgroud)

这更容易阅读,对科学家和工程师来说看起来更自然.正常的C#方式隐藏了"数学"迷雾中的好位.

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

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

using min = Math.Min;
...
double x = min(a,b);        
Run Code Online (Sandbox Code Playgroud)

但是"using"语句产生了一个错误,"System.Math.Min(十进制,十进制)是一个方法但是像一个类型一样使用"但是这看起来像是一个很好的解决方案.(无论如何,'小数'是什么?)

Sam*_*ica 8

如果你真的非常在乎,你可以编写自己的方法

private int min(int a, int b)
{
    return Math.Min(a, b);
}
Run Code Online (Sandbox Code Playgroud)

如果你雄心勃勃,你可以用泛型来做这件事


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

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);
Run Code Online (Sandbox Code Playgroud)

我事物命名的唯一原因piece2piece2,是因为我真的不知道你的表情应该计算.在实践中,你应该有更有意义的名字,如velocity,或incomeTaxPercentage

  • 像这样包装方法或作为扩展方法是当前最好的方法.你可以和代表们做一些聪明的事情但是要维护它会很痛苦.+1 (2认同)

Bra*_*NET 6

你不能这样做.至少,你不能在C#6之前做到这一点.

如果您使用的是C#6,您可以写:

using static System.Math;
Run Code Online (Sandbox Code Playgroud)

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

"使用"一个方法对编译器没有任何意义,或者在语义上,这就是你得到错误的原因.

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


Cod*_*dor 0

许多解决方案之一是在本地定义代表。代码

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

可以重写为以下实现。

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)));
Run Code Online (Sandbox Code Playgroud)

  • 唯一的问题是它强制一切都是“双重”,你不能对委托使用重载。(我正要回答同样的答案,并在输入示例时意识到了这个问题) (3认同)
  • 委托调用不仅会损害性能,还会给垃圾收集器带来负担。在这种情况下,将在堆上构造四个对象。 (2认同)