首先,对我的描述中的一些关键名词做出限定,以免因词汇含义不一致而导致不必要的误解。
用作限定名词的示例代码:
class A
{
private int _someData;
public int SomeData
{
get{return _someData;}
set{_someData = value;}
}
public void DoNothing()
{;}
}
class B
{
public void DoWork()
{
A a = new A();
A a1 = a;
object b = (object)a; //此处可以采取隐式转换,但为了明确、醒目起见,使用了强制转换
a.DoNothing();
}
}
对象:类的实例,在上例中,即指new运算符执行时在托管堆上创建的A类的一个实例;
引用变量:偶尔也简称为引用,在上例中即指变量a、a1、b;
托管堆:有时简称堆,但与非托管堆是有区别的,当说到非托管堆时,不会简称为堆 //个人习惯
栈:即堆栈,二者含义一致,堆栈一词可以理解为偏义词
-----------------------------------激情的分割线----------------------------------------------------------------
下面讲讲我的观点,抛砖引玉,望大家不吝赐教!
1、过程分析
A a = new A(); //执行时,在托管堆上创建一个A类的实例,在栈上创建一个引用变量a,该引用变量指向(或称引用)上述实例
A a1 = a; //执行时,没有创建新的A类的实例,在栈上创建了新的引用变量a1,a1与a指向同一个实例,但是a1与a本身存储在栈上的不同位置,并非同一个东西
object b = (object)a; //执行时,没有创建新的A类的实例或object实例,在栈上创建了新的引用变量b,b与a也指向同一个实例,至此,a,a1,b指向均同一个实例
2、关于引用变量
1)引用变量指向一个对象(类的实例),但是引用变量本身并非对象本身,不可混淆,二者存储位置不同。对象存储在堆上,而引用变量存储在栈上。
2)引用变量一旦定义,永远只能指向定义时所确定的类型或其子类型。如上示例中的a,被定义为对A类型的引用,则尝试让a指向其他类型(如object)时编译出错。
3)使用某类型的引用变量时,只能访问实例中在该类型层次上所暴露出来的成员(成员包括字段、属性和方法)
先说这么多吧,欢迎大家斧正,感谢大家参与!