C# C中的引用到底是什么#

C# C中的引用到底是什么#,c#,pointers,reference,C#,Pointers,Reference,根据我现在的理解,我可以说C#中的引用是一种指向对象的指针,该对象具有引用计数,并且知道类型兼容性。我的问题不是关于值类型与引用类型有何不同,而是关于如何实现引用 我已经阅读了引用和指针之间的区别,但这并没有涉及到引用的内容,而是它与C++中的指针相比,更多地描述了它的属性。我也理解按引用传递和按值传递之间的区别(如在C#中,对象默认按值传递,甚至是引用),但是,当我试图向同事解释为什么通过引用发送的参数不能像Eric Lippert关于堆栈的实现细节那样存储在闭包中时,我很难理解什么是引用 有

根据我现在的理解,我可以说C#中的引用是一种指向对象的指针,该对象具有引用计数,并且知道类型兼容性。我的问题不是关于值类型与引用类型有何不同,而是关于如何实现引用

<>我已经阅读了引用和指针之间的区别,但这并没有涉及到引用的内容,而是它与C++中的指针相比,更多地描述了它的属性。我也理解按引用传递和按值传递之间的区别(如在C#中,对象默认按值传递,甚至是引用),但是,当我试图向同事解释为什么通过引用发送的参数不能像Eric Lippert关于堆栈的实现细节那样存储在闭包中时,我很难理解什么是引用

有人能给我一个完整的,但希望是简单的解释,说明什么是C#中真正的引用,以及它们是如何实现的吗

<>编辑:这不是一个重复,因为它解释了一个引用是如何工作的,它是如何与一个值不同的,但是我要问的是如何在一个低级别上定义一个引用。C++中的< /P> < P>引用与C++引用非常类似。是的,事实上,垃圾收集的魔力正在发挥,但我想说的是,这是一个不同的、更大的话题

C引用与C++引用/不变指针类似:没有指针算术等,但可以重新分配它们(谢谢本!) 我要说的是,在实践中,一个区别是,由于指针在C#中通常不可用(不安全的关键字及其关联的指针又是一个不同且更大的主题),所以您会发现自己使用“out”关键字来完成指针指向指针的操作

您断言引用携带类型信息也是正确的。C#中的所有引用都来自对象类,对象类本身具有GetType()方法

但是,请注意,结构(通常被视为值,而不是引用)也有GetType()

根据我现在的理解,我可以说C#中的引用是一种指向对象的指针

如果你所说的“种类”是指“在概念上类似于”,是的。如果你的意思是“可以实施”,是的。如果您的意思是“与具有某种关系”,如“字符串是一种对象”,则不是。C类型系统在引用类型和指针类型之间没有子类型关系

哪个有引用计数

CLR的实现允许使用引用计数语义,但不需要这样做,而且大多数都不需要

并且知道类型兼容性

我不知道这是什么意思。对象知道自己的实际类型。引用具有与可验证代码中的实际类型兼容的静态类型。兼容性检查是在分析IL时由运行时的验证器实现的

我的问题不是关于值类型与 引用类型,但更多关于如何实现引用的信息

毫不奇怪,如何实现引用是一个实现细节

有人能给我一个完整的,但希望是简单的解释,关于C#中真正的引用是什么

引用是C语言规范指定作为引用的东西。即:

  • 对象(引用类型)具有独立于其字段值的标识
  • 任何对象都可以引用它
  • 这种引用是一个可以像任何其他值一样传递的值
  • 对这些值执行相等比较
  • 两个引用当且仅当它们引用同一对象时才相等;也就是说,引用具体化了对象标识
  • 存在唯一的空引用,它不引用任何对象,并且不等于对对象的任何有效引用
  • 静态类型对于任何引用值都是已知的,包括null引用
  • 如果引用为非null,则引用的静态类型始终与引用的实际类型兼容。例如,如果我们有一个对字符串的引用,引用的静态类型可以是string、object或IEnumerable,但不能是Giraffe。(显然,如果引用为null,那么就没有要具有类型的referent。)
可能有一些规则我错过了,但这就是我的想法引用是任何行为类似于引用的内容。这就是你应该关注的。引用是一种有用的抽象,因为它们是使对象标识独立于对象值的抽象

还有一点关于它们是如何实现的

实际上,C#中引用类型的对象被实现为内存块,内存块以一个包含对象信息的小头开始,引用被实现为指向该块的指针。由于我们有一个多代标记和扫描压缩收集器,这个简单的方案变得更加复杂;它必须知道引用的图形,以便在压缩堆时可以在内存中移动对象,而不会丢失引用标识的轨迹

作为练习,你可能会考虑如何实施这样的计划。它构建了一个角色,试图弄清楚如何构建一个系统,其中引用是指针,对象可以在内存中移动。你会怎么做

当我试图向我的同事解释为什么引用发送的参数不能存储在闭包中时,我很难理解什么是引用

这很棘手。从概念上理解,对变量的引用(C#中的
ref
参数)和对t的引用是很重要的
void M() 
{
  int x = 123;
  N(ref x);
}
void N(ref int y)
{ 
    y = 456;
static bool EqualAliases(ref int y, ref int z)
{
  return true iff y and z are both aliases for the same variable
}
static bool EqualReferences(object x, object y)
{
  return x == y;
}