我正在处理 ref
的相关工作,但并不理解其是否类似于C/C++的指针,还是更像C++中的引用?
为什么会提出这样一个问题呢?因为当我阅读C#/.NET书籍、MSDN或与C#开发人员交流时,我会因以下原因而感到困惑:
- C#开发人员建议不要在函数的参数中使用
ref
,例如:...(ref Type someObject)
对他们来说不太好,而且他们建议使用...(Type someObject)
,但我真的不太明白这个建议。我听到的原因是:最好使用对象的副本,然后将其用作返回值,避免通过引用损坏内存等等……通常我会听到有关数据库连接对象的解释。根据我的普通C/C ++经验,我真的不明白为什么在C#中使用引用是不良做法?我控制对象的生命周期及其内存分配/重新分配等等……我只在书籍和论坛中看到建议它是不好的,因为你可能会通过引用失去它来破坏您的连接并导致内存泄漏
,但实际上我可以手动地控制我想要的内容,所以为什么会是不良做法呢?
ref
是指针(*
)还是类似于C++中的引用(&
)? 我记得在C/C++中指针总是分配一个大小为void*
类型的空间 - 4个字节(有效大小取决于架构),其中包含结构或变量的地址。在C++中通过传递引用&
时,没有从堆栈分配新的空间,而是直接使用已经定义好的对象,并且没有像在纯C中那样对指针进行外部子分配内存。那么C#中的ref
是什么? .NET VM是否像在纯C/C++中的指针一样来处理它,并且它的GC
为指针分配临时空间,还是像C ++中的引用那样工作? ref
只能正确地与托管类型一起使用,还是对于像bool,int
这样的值类型,最好切换到unsafe
代码并以非托管方式通过指针传递?
ref
参数看作是指向指针的 C++ 指针,至少对于 C# 中的“引用”类型(即所有类)来说是这样。对于 C# 值类型(如结构体和整数),它们就像 C++ 的值类型,而 C# 中值类型的ref
参数则相当于 C++ 中的指针。 - Matthew Watson