问题描述
C# 中的 BigInteger 是按值传递还是按引用传递?我有一个代码,我需要按值传递它们,我认为它们是作为个人参考传递的,因为在初始调用函数中进行了一些调用后值会发生变化,但不确定实际情况是否如此。
请帮忙:)
解决方法
从技术上讲,C#(以及 Java)中的所有对象都是按值传递的(默认)。
- 对于引用类型,这个值恰好是一个引用(指针)。这就是方法内部的更改会影响实际对象的原因。
- 对于值类型,此值是变量保存的实际值。这就是方法内部的更改不会影响实际对象的原因。
BigInteger
无论如何都不特别,它是一个 struct(这是一种值类型)。
如果要通过引用传递对象,可以使用 ref
关键字。
另见:
- Passing Reference-Type Parameters (C# Programming Guide)
- Passing Value-Type Parameters (C# Programming Guide)
您可能还想看看 this question 的答案。
,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 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)