【发布时间】:2016-11-18 22:14:55
【问题描述】:
根据我现在的理解,我可以说 C# 中的引用是一种指向具有引用计数并知道类型兼容性的对象的指针。我的问题不是关于值类型与引用类型有何不同,而是更多关于如何实现引用。
我已经阅读this post 了解引用和指针之间的区别,但这并没有涵盖太多关于什么是引用,但与 C++ 中的指针相比,它更多地描述了它的属性.我也理解按引用传递和按值传递之间的区别(因为在 C# 中,对象默认按值传递,甚至是引用),但是当我试图向我的解释时,我很难理解什么是真正的引用同事们为什么不能像 Eric Lippert blog entry 中关于堆栈作为实现细节的那样将通过引用发送的参数存储在闭包内。
有人可以为我提供一个完整但希望简单的解释,说明 C# 中的引用到底是什么,以及它们是如何实现的?
编辑:这不是重复的,因为在Reference type in C# 中解释了引用如何工作以及它与值有何不同,但我要问的是如何在低级别定义引用。
【问题讨论】:
-
Reference type in C#的可能重复
-
如果你认为引用计数有什么问题,你不明白。
-
关于“当我试图向我的同事解释为什么引用发送的参数不能存储在闭包中时”引用类型的变量和 byref 参数之间的重要区别是第一个一个会影响它所指向的对象的生命周期,而第二个则不会。它们有很多相似之处(它们拥有一个地址,如果 GC 执行堆压缩,它们将自动调整),但这些对于您的特定点来说并不那么重要。
-
@BenVoigt
ref参数可以引用一个装箱的值类型,不是吗?如果发生这种情况,ref参数可能是唯一剩余的引用,如果这不会导致生命周期延长,那么事情就会变得非常糟糕。 -
我会小心不要将
ref变量和对对象的引用混为一谈。它们在概念上完全不同。在 C# 中,对对象的引用指的是作为一个整体的对象,ref变量是另一个变量的别名。你可以看出它们在概念上是不同的,因为 C# 允许对它们进行不同的操作。您可以获取两个对object的引用并在它们上调用ReferenceEquals以确定它们是指相同的对象还是不同的对象。但是在 C# 中没有办法确定两个ref参数是否引用同一个变量。