C#指针/引用

时间:2014-11-25 20:00:09

标签: c# .net reference

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

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

b指向一个?什么时候有这种指针/参考? (如果有的话) 对不起这个可能很愚蠢的问题。 谢谢!

3 个答案:

答案 0 :(得分:8)

b未指向a,不,b指向a在分配时引用的对象。 变量 a中的更改将无法通过b进行观察。对{em} a 引用的对象的更改将被b观察到。

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

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

每当调用c时,它将在调用时返回a 的值而不是在构造委托时,因为lambdas会关闭变量并且不是价值观。

答案 1 :(得分:1)

这取决于Dog是什么。

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

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

还有其他类型的参考,例如:

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

此处b是引用参数,因此可以是对引用类型的引用,也可以是对值类型的引用,具体取决于上述Dog的定义。

索引数组的结果也是一种引用类型,允许人们改变存储在数组中的可变值类型,尽管可变值类型的值有限(有时候它们很有用但是它们有用经常引起混淆,通常最好不要被大会暴露。)

*通常,静态变量中没有这样的引用,在本地可能不会再次使用的引用中没有这样的引用,或者在这些方法之一中没有可以转换的类中的字段。

答案 2 :(得分:0)

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

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

该对象碰巧存储在其中的内存地址是一个高度不稳定的东西,可能会随时因多种原因而改变,除非您使用fixed固定对象:

  

fixed语句设置一个指向托管变量的指针和&#34;引脚&#34;   在执行语句期间的那个变量。没有固定,   从那以后,指向可移动托管变量的指针几乎没用   垃圾收集可以无法预测地重定位变量。 C#   编译器只允许您指定一个托管变量的指针   固定陈述。

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