本周我一直在研究一些基于反射的代码,并且在单元测试期间发现了一个意外情况:指针是引用类型.C#代码typeof(int).MakePointerType().IsClass返回true.
我检查了刚刚到达的Annotated CLI标准,果然,指针被明确定义为引用类型.
这对我来说很奇怪,来自C++背景.我只是假设指针是值类型.
指针类型是引用类型而不是值类型是否有特殊原因?
更新(澄清)
在谈论指针和引用时,关于"指针"和"指针"的事情常常令人困惑.所以这里有一些澄清.
类型可以是引用类型或值类型,但变量有点不同.(对不起,我没有机会阅读我的CLI标准,因此术语和概念可能有误 - 请纠正我!)
给定此代码(引用类型的局部变量概念):
var x = new MyClass();
var y = x;
Run Code Online (Sandbox Code Playgroud)
变量x和y实际上不是引用类型,但他们是一个对象,它是引用类型(引用MyClass是引用类型).换句话说,x并且y不是引用类型的实例; 它们只引用引用类型的实例.
给定此代码(值类型的局部变量概念):
var x = 13;
var y = x;
Run Code Online (Sandbox Code Playgroud)
变量x和y实例值类型(或者至少就像它们的实例一样).
那么我们来看看这段代码:
var i = 13;
var x = &i;
var y = x;
Run Code Online (Sandbox Code Playgroud)
如果指针类型是引用类型,那么这就是我解释语句的方式x = &i:
int*创建一个类型的实例,指向i.x 是对此指针实例的引用.y = x被执行时,参考被复制.既y与x参考指针对象的相同的实例.也许我对这种解释完全错了.
来自C++背景,对于指针是值类型更有意义,因此该语句x = &i只是将i值的类型实例的地址分配给x,并将y = x该地址值复制到y.不会在堆上创建"指针对象".