【发布时间】:2011-08-01 13:41:56
【问题描述】:
我有两个问题,源于观察到的 C# 静态方法的行为(我可能会误解):
首先: 递归静态方法是否会在某种意义上通过静态方法在幕后实现的方式进行尾调用优化?
第二: 用静态方法编写整个应用程序并且没有超出本地范围的变量是否等同于函数式编程?我想知道,因为我还没有完全理解我一直听到的关于函数式编程的“无副作用”术语。
编辑: 让我提一下,我确实使用并理解为什么以及何时在普通 C# OO 方法中使用静态方法,并且我确实理解尾调用优化不会显式地对递归静态方法进行。也就是说,我理解尾调用优化是一种尝试在每次传递时停止创建新堆栈帧的尝试,并且我在几个点观察到似乎是在其调用方法的框架内执行的静态方法,尽管我可能误解了我的观察结果。
【问题讨论】:
-
不,在 C# 中仅编写静态方法不是函数式编程。这是对多范式、主要面向对象的语言的严重滥用。
-
@delnan:我并不是建议我这样做,我试图理解“没有副作用”的含义,以及是否可以按照我所说的方式实现。我每天都写很多快乐的 OO C#,我不需要讲课为什么一个全静态的应用程序在 C# 中毫无意义。 C# 只是我理解其他事物的一个参考框架。
-
如果你真的想深入了解“无副作用”的编程概念,你应该开始尝试像 Haskell 这样的纯函数式编程语言。您当然可以在 C# 中以纯函数式编程,但 Haskell(与 C# 不同)强烈鼓励这种编程风格,而不仅仅是让它成为可能。
-
@Jimmy:如果你有一个静态方法,它接受一个数组作为参数,然后将数组的第一个元素设置为 42,即使你没有涉及任何非局部变量。也没有理由为什么方法应该是静态的才能没有副作用。您当然可以编写纯函数式、无副作用的代码,同时仍然使用 OO 概念。
-
@Chris:在给定的上下文中这怎么无效。吉米所说的都是静态的,没有全局变量。我的方法当然满足这些要求,所以我很确定这是一个完全有效的反例,即静态和全局无必然意味着无副作用的论点。至于地图,我不明白为什么它不能成为列表上的实例方法(例如在 scala 中)。
标签: c# .net static functional-programming