C#中有引用或指针吗? (不使用/不安全)例如,
Dog a = new Dog()
Dog b = a;
b指向一个?什么时候有这种指针/参考? (如果有的话) 对不起这个可能很愚蠢的问题。 谢谢!
答案 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
定义的引用类型,则a
和b
都是对同一对象的引用。此对象位于堆上,并且在任何代码*都不能使用此类引用时,将有资格进行收集。
如果Dog
是使用struct Dog
定义的值类型,则b
是a
的副本。
还有其他类型的参考,例如:
void DoSomething(Dog a, ref Dog b)
{
b = a;
}
此处b
是引用参数,因此可以是对引用类型的引用,也可以是对值类型的引用,具体取决于上述Dog
的定义。
索引数组的结果也是一种引用类型,允许人们改变存储在数组中的可变值类型,尽管可变值类型的值有限(有时候它们很有用但是它们有用经常引起混淆,通常最好不要被大会暴露。)
*通常,静态变量中没有这样的引用,在本地可能不会再次使用的引用中没有这样的引用,或者在这些方法之一中没有可以转换的类中的字段。
答案 2 :(得分:0)
在其他语言中,指针是一个保存内存地址的变量。
在C#中,引用不指向内存地址,而是指向对象。
该对象碰巧存储在其中的内存地址是一个高度不稳定的东西,可能会随时因多种原因而改变,除非您使用fixed
固定对象:
fixed语句设置一个指向托管变量的指针和&#34;引脚&#34; 在执行语句期间的那个变量。没有固定, 从那以后,指向可移动托管变量的指针几乎没用 垃圾收集可以无法预测地重定位变量。 C# 编译器只允许您指定一个托管变量的指针 固定陈述。
因此可以说没有使用fixed
代码就没有指针。