[英]Arguments passed "by name" in C#
Scala编程语言有一个简洁的特性,称为pass by name arguments ,它允许某些参数仅在需要时才被评估。
例如,可以使用以下柯里化方法编写while
循环:
// This is Scala code. A simulated while loop
@scala.annotation.tailrec
def myWhile(condition: => Boolean)(actions: => Unit): Unit = {
if(condition) {
actions
myWhile(condition)(actions)
}
}
这个方法可以像常规的while
循环一样使用,这要归功于Scala的语法糖、闭包和——这里特别感兴趣的——将表达式作为函数参数传递的能力,当被引用时会被评估(如: => type
所示参数声明)。
例如,以下打印“Hello!” 到控制台十次:
var i = 0
myWhile(i < 10) {
println("Hello!")
i += 1
}
对于那些需要了解正在发生的事情的人,每次condition
出现在方法内的if(...)
语句中时,都会评估表达式i < 10
,类似地, println("Hello!"); i += 1
每次actions
出现在方法的主体中时,都会评估println("Hello!"); i += 1
。 当为下一次迭代递归调用myWhile
时,表达式按原样传递,因为该方法需要表达式,而不是值。 Scala术语这些通过名称参数传递。
如果这些参数是按值传递的,那么i < 10
将作为false
传递给myWhile
,而 "Hello!" 将只打印一次, i
将增加一次,并且循环将无限执行。
( Scala主要是一种函数式语言,这段代码甚至不接近FP ,但它是一个简单的例子。)
我的问题是,有没有办法以这种方式将参数传递给C#函数? 另请注意,我仅限于使用C# 7.3 。 :-(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.