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(十进制,十进制)是一个方法但是像一个类型一样使用"但是这看起来像是一个很好的解决方案.(无论如何,'小数'是什么?)
如果你真的非常在乎,你可以编写自己的方法
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)
我事物命名的唯一原因piece2和piece2,是因为我真的不知道你的表情应该计算.在实践中,你应该有更有意义的名字,如velocity,或incomeTaxPercentage
你不能这样做.至少,你不能在C#6之前做到这一点.
如果您使用的是C#6,您可以写:
using static System.Math;
Run Code Online (Sandbox Code Playgroud)
在文件的顶部,这将允许您访问其静态方法而不使用类型名称(Math).
"使用"一个方法对编译器没有任何意义,或者在语义上,这就是你得到错误的原因.
最后decimal是另一种数字类型(如double).它只是选择了Math.Min生成错误时的重载.
许多解决方案之一是在本地定义代表。代码
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)