C# 使用ref关键字传递值

C# 使用ref关键字传递值,c#,parameters,ref,C#,Parameters,Ref,阅读之后,我对C#在使用ref关键字传递值类型时所做的工作感到困惑。文档说明ValueType未装箱。我的问题是C#如何处理将值类型作为引用传递?是否将某些副本传递给堆栈上分配的数据?谢谢 是否将某些副本传递给堆栈上分配的数据 不,它不复制 >代码> >代码> OUT//COD>关键字可以与C中的指针传递或C++中的引用传递,当变量的内存位置(即地址)传递给目标方法时。然后,获取引用的方法将使用传入的内存位置直接就地修改该值 知道变量是通过引用传递的,编译器插入指令,将ref变量视为地址,允许进

阅读之后,我对C#在使用ref关键字传递值类型时所做的工作感到困惑。文档说明ValueType未装箱。我的问题是C#如何处理将值类型作为引用传递?是否将某些副本传递给堆栈上分配的数据?谢谢

是否将某些副本传递给堆栈上分配的数据

不,它不复制<代码> >代码> >代码> OUT//COD>关键字可以与C中的指针传递或C++中的引用传递,当变量的内存位置(即地址)传递给目标方法时。然后,获取引用的方法将使用传入的内存位置直接就地修改该值

知道变量是通过引用传递的,编译器插入指令,将
ref
变量视为地址,允许进行就地修改。

tl;博文博士:博文不是“如何创建引用”;这是“如何为那些不希望使用原语值类型的消费者打包原语值类型”

在.NET中,引用类型是堆上的类实例。像
int
double
这样的值类型只是字节:32位int只相当于四个字节的0和1。当你把它放进去时,比如说一个
System.List
(Granpaw在General Store中删掉的旧的前泛型类型),然后把它拿出来,如果你调用它的GetType(),编译器怎么知道该怎么做?它只有四个字节的。。。什么?谁知道呢?如果它在
列表中存储了一个指针,那么它将有一个指向四个字节的。。。谁知道呢

在您自己的方法中,生成的代码知道您的变量是什么。定期进行强类型检查。但是,当您将变量的值发送给只知道他期望的是
对象的其他人时,这就行不通了

因此,当您将
int
添加到
列表
,或将其传递给以
对象
为参数的函数时,编译器必须向其添加一些信息,以便其他人都知道他得到了什么

因此,“装箱”意味着将非参考值打包到一个对象中,该对象可以被视为
对象
的实例。对于普通的
ref
参数,这是不必要的,因为类型是完全已知的:为函数的内部生成的代码不必准备处理任何任意的引用类型。它知道它将得到(例如)一个指向整数的指针,这就是它将得到的全部内容。装箱提供了本例中不需要的功能,因此编译器不会浪费用户的周期

拳击并不是唯一一种引用(从最广义的意义上来说)例如
double
的方式。相反,装箱是将
double
视为可存储在
系统中的对象的唯一方法。List
:它必须位于堆上,必须可强制转换为
对象,必须具有运行时类型信息等

对于以下情况,所有呼叫者或被呼叫者需要的是某处的地址:

void f(ref double d) { d *= 2; }

即使引用类型不按引用传递,它们的地址也按值传递。看见