【问题标题】:How are BigInteger passed in functionsBigInteger 是如何传入函数的
【发布时间】:2021-01-15 20:00:57
【问题描述】:

C# 中的 BigInteger 是通过值传递还是通过引用传递?我有一个代码,我需要按值传递它们,我认为它们是个人作为引用传递的,因为在初始调用函数中的一些调用后值会发生变化,但不确定是否真的如此。

请帮忙:)

【问题讨论】:

  • 你的代码是什么?你为什么认为你在观察这种行为?
  • @SumnerEvans 这有点复杂,现在我必须重新考虑它,因为我知道 BigIntegers 是按值传递的:)
  • BigInteger包含一个数组,数组本身是通过ref传递的,但是整个struct是不可变的,是通过val传递的

标签: c# biginteger


【解决方案1】:

从技术上讲,C#(以及 Java)中的所有对象都是按值传递的(默认情况下)。

  • 对于引用类型,这个值恰好是一个引用(指针)。这就是方法内部的更改会影响实际对象的原因。
  • 对于值类型,该值是变量所持有的实际值。这就是方法内部的更改不会影响实际对象的原因。

BigInteger 无论如何都不特殊,它是一个 struct(它是一个值类型)。

如果你想通过引用传递一个对象,你可以使用ref关键字。

另见:

您可能还想查看this question 的答案。

【讨论】:

  • @OlivierRogier 不,这不是错误的。这只是许多开发人员的常见误解。这就是 C# 存在 ref 修饰符的原因。将默认行为从“按值传递”更改为“按引用传递”。
  • @OlivierRogier 请参阅this docs。它解释了按值传递引用类型与通过引用传递它们。我还将更新我的答案以包含此链接。
  • "类的实例默认通过引用传递" => 不正确。请再次阅读我的解释,并检查支持我的话的文档。另请参阅@JonSkeet 在stackoverflow.com/questions/8708632中的回答
【解决方案2】:

BigInteger 是一个struct,所以它是一个value type 并且默认通过by value

因为结构是值类型,所以当您将结构按值传递给方法时,该方法会接收结构参数的副本并对其进行操作。该方法无法访问调用方法中的原始结构,因此无法以任何方式更改它。该方法只能更改副本。

Passing Value-Type Parameters (C# Programming Guide)

值类型变量直接包含其数据,而引用类型变量则包含对其数据的引用。通过值将值类型变量传递给方法意味着将变量的副本传递给方法。在方法内部对参数进行的任何更改都不会影响存储在参数变量中的原始数据。如果你希望被调用的方法改变参数的值,你必须通过引用传递它,使用 ref 或 out 关键字。您也可以使用 in 关键字通过引用传递值参数,以避免复制,同时保证值不会被更改。为简单起见,以下示例使用 ref.

如果你想通过引用传递这样的类型,你可以使用ref关键字。

Passing Reference-Type Parameters (C# Programming Guide)

引用类型的变量不直接包含它的数据;它包含对其数据的引用。当您通过值传递引用类型参数时,可以更改属于被引用对象的数据,例如类成员的值。但是,您不能更改引用本身的值;例如,您不能使用相同的引用来为新对象分配内存并让它在方法之外持续存在。为此,请使用 ref 或 out 关键字传递参数。为简单起见,以下示例使用 ref.

因此,只有在调用方法(如类的实例)之前被压入堆栈的内存指针(在 x32 或 x64 系统上为 4 或 8 个字节),而不是整个结构内容(所有成员的副本,例如,如果结构有 8 个整数,则为 8x4 字节,至少)。

Pass c# struct by reference

Passing a struct by Reference

Pass reference by reference vs pass reference by value - C#

Passing a Reference vs. Value (Pluralsight)

Understanding C# Pass by Reference and Pass by Value (Udemy)

Passing Arguments By Value and By Reference (C# 6 for Programmers, 6th Edition)

【讨论】:

  • 第一句的措辞表明,按值传递是值类型的结果。这是错误的和误导性的。在按值与按引用中,唯一 是在类型之前存在refoutin。没有这些,它是按价值计算的。传递的值是什么...... 那个是作为值类型或引用类型的结果。
  • 引用类型也是按值传递的。该值是参考。
  • 我不明白你为什么要向我引用文档。我没有说任何不同的东西。您自己在答案中的措辞是错误地解释文档。
  • 该更新无法解决问题。第一句仍然暗示它只是按值传递因为它是一个值类型(因果关系与引用类型相反)。
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多