如何避免在 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);
我将事物命名为 piece2
和 piece2
的唯一原因是因为我实际上并不知道您的表达式应该计算什么。实际上,您应该使用更有意义的名称,例如 velocity
或 incomeTaxPercentage
下一版本的 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。
我正在编写一些数学方面的 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);
我将事物命名为 piece2
和 piece2
的唯一原因是因为我实际上并不知道您的表达式应该计算什么。实际上,您应该使用更有意义的名称,例如 velocity
或 incomeTaxPercentage
下一版本的 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。