C# 指针/引用

本文关键字:引用 指针 | 更新日期: 2023-09-27 18:31:52

C#中有引用或指针吗?(不使用/unsafe),例如,

Dog a = new Dog()
Dog b = a;

b 会指向 a 吗?什么时候有这种指针/引用?(如果有的话)对不起,这个可能很愚蠢的问题。谢谢!

C# 指针/引用

b

指向a,不,b指向a在赋值时引用的对象。 变量a的变化将无法通过b观察到。 对 a 引用的对象所做的更改将可被b观察到。

不过,有一些方法可以引用a(变量,而不是它引用的值)。 一个是λ:

Func<Dog> c = () => a;

每当调用 c 时,它都会在调用时而不是构造委托时返回 a 的值,因为 lambda 关闭变量而不是值。

这取决于Dog是什么。

如果Dog是使用 class Dog 定义的引用类型,则 ab 都是对同一对象的引用。此对象位于堆上,并且当任何代码*都无法使用此类引用时,将有资格进行收集。

如果Dog是用struct Dog定义的值类型,则ba的副本。

还有其他类型的引用,例如:

void DoSomething(Dog a, ref Dog b)
{
  b = a;
}

此处b是一个引用参数,因此要么是对引用类型的引用,要么是对值类型的引用,具体取决于上述Dog的定义。

索引数组的结果也是一种引用类型,允许改变存储在数组中的可变值类型,尽管可变值类型的值有限(有时它们很有用,但它们经常引起混淆,通常最好不要由程序集公开)。

*通常,静态变量中没有此类引用,

局部变量中没有可能再次使用的此类引用,或者类中没有可以通过这些方式之一访问的字段。

在其他语言中,指针是保存内存地址的变量。

在 C# 中,引用不指向内存地址,而是指向对象。

存储该对象的内存地址是一个高度易失性的东西,可能随时更改,并且由于多种原因,除非您使用 fixed 固定对象:

fixed 语句设置指向受管变量和"引脚"的指针 语句执行期间的该变量。没有固定, 指向可移动托管变量的指针用处不大,因为 垃圾回收可能会不可预测地重新定位变量。The C# 编译器只允许您在 固定语句。

因此,可以说,如果不使用fixed代码,就没有指针。