【发布时间】:2023-04-05 02:47:01
【问题描述】:
我正在使用ref 并不清楚“它是像 C/C++ 中的指针还是像 C++ 中的引用?”
我为什么要问你想了一会儿的这么弱的问题? 因为,当我阅读 C#/.NET 书籍、msdn 或与 C# 开发人员交谈时,我会被以下原因弄糊涂:
- C# 开发人员建议不要在函数的参数中使用
ref,e.g. ...(ref Type someObject)对他们来说味道不好,他们建议...(Type someObject),我真的不明白这个建议。我听到的原因:最好使用对象的副本,然后将其用作返回值,而不是通过引用等破坏内存......我经常听到有关数据库连接对象的此类解释。就我普通的 C/C++ 经验而言,我真的不明白为什么在 C# 中使用引用是一件坏事?我控制对象的生命及其内存分配/重新分配等...我在书籍和论坛中阅读仅建议it's bad, because you can corrupt your connection and cause a memory leak by a reference lose,所以我控制对象的生命,我可以手动控制我真正想要的,那为什么不好吗? - 现在阅读不同的书和与不同的人交谈,我不太清楚
ref是指针 (*) 还是&在 C++ 中的引用?我记得 C/C++ 中的指针总是分配一个大小为void*类型的空间 - 4 个字节(有效大小取决于体系结构),其中托管结构或变量的地址。在 C++ 中,通过传递引用&没有来自堆/堆栈的新分配,并且您在内存空间中使用已经定义的对象,并且没有像普通 C 中那样为外部指针分配内存。那么 @ 是什么987654334@ 在 C# 中? .NET VM 是否像普通 C/C++ 中的指针一样处理它,并且它的GC为指针分配临时空间,或者它是否像 C++ 中的引用一样工作?ref仅适用于托管类型,还是适用于bool, int之类的值类型?最好切换unsafe代码并以非托管样式传递指针?
【问题讨论】:
-
有趣的问题。我每天都在 C 中使用指针/引用,并且以前在 C# 中也使用过 ref,但从未真正考虑过详细的相似之处。作为旁注,指针大小当然取决于平台,并不总是如您所说的 4 字节。
-
由于您来自 C++,您可能最好将 C# 引用类型变量视为 C++ 指针,而将 C#
ref参数视为指向指针的 C++ 指针,至少就 C#“引用”类型而言(即所有类)。对于 C# 值类型(例如结构和整数),它们类似于 C++ 值类型,而 C# 中值类型的ref参数类似于 C++ 中的指针。 -
Jon Skeet 写了一篇关于参数传递的好文章,详细描述了不同之处。你可以阅读它here
标签: c# pointers memory-management reference ref