bea*_*mit 21 c# variadic-functions
我需要找到3个值之间的最小值,我最终做了这样的事情:
Math.Min(Math.Min(val1, val2), val3)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点傻,因为其他语言使用可变函数.我非常怀疑这是一个疏忽.
有什么理由说明简单的Min/Max函数不是变量的吗?是否有性能影响?有没有我没注意到的可变版本?
Wil*_*sem 33
如果它是一个集合(一个子类IEnumerable<T>
),可以很容易地使用System.Linq
库中的函数
int min = new int[] {2,3,4,8}.Min();
Run Code Online (Sandbox Code Playgroud)
此外,您可以自己轻松实现这些方法:
public static class Maths {
public static T Min<T> (params T[] vals) {
return vals.Min();
}
public static T Max<T> (params T[] vals) {
return vals.Max();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用简单的标量来调用此方法,这样Maths.Min(14,25,13,2)
就可以了2
.
这些都是通用的方法,所以没有必要实施这种方法为每种类型的数字(int
,float
,...)
我想,为什么这些方法不是一般执行的根本原因是,每次调用此方法的阵列(或至少一个IList
对象应该被创建.通过保持较低水平的方法之一可避免的开销.不过,我同意一个可以添加这些方法让Math
班上的一些程序员的生活更加轻松.
CommuSoft已经解决了如何在C#中完成等效的工作,所以我不会翻阅那部分内容.
要专门解答你的问题"为什么不是C#的Math.Min/Max可变参数?",我会想到两个想法.
首先,Math.Min(和Math.Max)实际上不是C#语言特性,它是一个.NET框架库特性.这可能看起来很迂腐,但这是一个重要的区别.事实上,C#没有提供任何特殊目的语言功能来确定两个(或更多)潜在值之间的最小值或最大值.
其次,正如Eric Lippert多次指出的那样,语言功能(可能是框架功能)没有被"删除"或被主动排除 - 所有功能都没有实现,直到有人设计,实现,测试,记录和发布功能.请看这里的例子.
不是一个.NET框架开发人员,我不能谈论发生的实际决策过程,但似乎这是一个功能的经典案例,根本没有上升到包含的水平,类似于序列foreach"功能"Eric在提供的链接中讨论.
归档时间: |
|
查看次数: |
3230 次 |
最近记录: |