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