Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BigInteger是如何传入函数的_C#_Biginteger - Fatal编程技术网

C# BigInteger是如何传入函数的

C# BigInteger是如何传入函数的,c#,biginteger,C#,Biginteger,C#中的大整数是通过值传递还是通过引用传递?我有一个代码,其中我需要通过值传递它们,我认为它们是作为引用传递的,因为在初始调用函数中进行一些调用后,值发生了更改,但不确定实际情况是否如此 请帮助:)是a,因此它是a,默认情况下传递: 因为结构是一种值类型,所以当您按值将结构传递给方法时,该方法接收并操作结构参数的副本。该方法无法访问调用方法中的原始结构,因此无法以任何方式更改它。该方法只能更改副本 值类型变量直接包含其数据,而引用类型变量包含对其数据的引用。通过值将值类型变量传递给方法意味着将

C#中的大整数是通过值传递还是通过引用传递?我有一个代码,其中我需要通过值传递它们,我认为它们是作为引用传递的,因为在初始调用函数中进行一些调用后,值发生了更改,但不确定实际情况是否如此

请帮助:)

是a,因此它是a,默认情况下传递:

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

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

如果要通过引用传递此类类型,可以使用关键字

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

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


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

  • 对于引用类型,此值恰好是引用(指针)。这就是为什么方法内部的更改会影响实际对象
  • 对于值类型,此值是变量持有的实际值。这就是为什么方法内部的更改不会影响实际对象的原因
无论如何,它并不特别,它是一个结构(一种值类型)

如果要通过引用传递对象,可以使用关键字

另见:


您可能还想看看的答案。

您的代码是什么?为什么你认为你在观察这个行为?
biginger
是一个
struct
:@SumnerEvans它有点复杂,现在我知道biginger是通过值传递的:)
biginger
包含一个数组,数组本身是通过ref传递的,但是整个结构是不可变的,并且是按值传递的。第一句话的措辞表明,按值传递是作为值类型的结果。这是错误和误导的。在“按值”与“按引用”中唯一相关的是在类型之前存在
ref
out
in
。如果没有这些,它的价值。传递的值是。。。这是作为值类型或引用类型的结果。引用类型也按值传递。这个值就是参考值。我不明白你为什么要向我引用文档。我没有说任何不同的话。你自己在回答中的措辞错误地解释了文档。该更新并不能解决问题。第一句话仍然暗示它只通过值传递,因为它是一种值类型(与引用类型形成对比的因果关系)。@OlivierRogier Nope,这不是错的。这只是许多开发人员常见的误解。这就是为什么C#存在
ref
修饰符的原因。将默认行为从“按值传递”更改为“按引用传递”。@OlivierRogier请参见。它解释了按值传递引用类型与按引用传递引用类型的区别。我还将更新我的答案以包含此链接。“默认情况下,类的实例通过引用传递”=>not true。请再次阅读我的解释,并检查支持我的文字的文档。另请参阅中的@JonSkeet的答案