c# - 按名称调用和按引用传递的概念是不同的概念吗?

标签 c# scala evaluation

至少在我的脑海中,我一直对函数的值传递与引用传递有很好的了解。不过,我正在研究 Scala,它的按名称调用的概念似乎是相关的,但它有自己独特的概念

例如在C#中存在ref关键字,在Scala中存在通过名称=>运算符调用。

我的理解是 ref 关键字 - 至少大致 - 用于传递指向一段数据的指针,而不是那段数据本身。即,当与 Integer 数据类型一起使用时,如果您在函数内部修改 Integer,Integer 也会在被调用方受到影响。

手上按名称调用描述了一种评估策略,其中参数中的任何表达式都将被延迟,直到在函数内部使用表达式。

我的理解是否正确?如果是这样,这些概念是否恰好具有相关名称,或者我没有看到图片的一部分?谢谢!

最佳答案

Are the concepts of call by name and pass by reference separate concepts?

是的。这些是不同的概念。 Call-by-name 是关于何时我们评估的;传递引用是关于我们传递的什么

按名称调用 意味着每次函数使用函数参数时都会计算函数参数,而不是在函数接收它之前。

按值调用(也称为按值传递)表示

  • 函数参数在函数接收之前被评估,并且
  • “结果值绑定(bind)到函数中的相应变量。”

按引用调用(也称为按引用传递)意味着函数接收“对变量的隐式引用...而不是其值的副本。”

虽然按名称调用是一种非严格的评估策略,但按值调用和按引用调用是两种不同的严格(急切)评估策略。

另见 https://en.wikipedia.org/wiki/Evaluation_strategy

关于c# - 按名称调用和按引用传递的概念是不同的概念吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537453/

相关文章:

xml - 在 Scala 中编码/解码 XML

c++ - 在 C++ 中使用堆栈评估后缀

C++ 运算符顺序评估

arrays - Excel 数组求值和一些技巧

scala - 如何使用 2d GUI (nifty-gui) 正确渲染 3d 对象?

C# 在另一个 bool 方法中引用一个 bool 方法的返回值

c# - 切割 3D 图像

c# - 如何从 C# 调用由 Kotlin/Native 生成​​的 native C 库中的函数?

c# - NHibernate SaveOrUpdate 子集合未使用标识 ID 更新

java - 寻找 Javacpp FFMPEG CustomIO 示例