类,数组,泛型,String字符串都是引用类型。
引用类型说明例子:
在一个作用域中定义一个string
{//1
string str="123456";//2
}//3
代码运行到在1时,CLR会知道在这个作用域中要的内存空间是多少,在内存中开辟出来了一个线程栈。
代码运行到在2时,可理解为这句话分成了两步:
string str;str="123456";
1,string str;在栈中有了str这个变量,但并没有值。同时也没有对托管堆分配空间。
2,str="123456";先在托管堆中放进"123456"这个字符串,同时分配了在托管堆中的地址NN1,再把NN1放进栈中,这样栈中才存在了值。
代码运行到在3时,作用域结束,然后在代码里,从下到上依次释放作用域中的变量(即清空str变量在栈中的值)。
这时,str变量在栈中就不存在了,但"123456"这个值还是在托管堆中的。
String的说明:
1,字符串的 不可变性
string str="123456";声明了一个变量字符串str,就等于在托管堆中创建了一个"123456"的值
str="555";之后有重新给str赋了另外的值,等于有在托管堆中创建了一个"555"的值,并把地址指向了str,
引用类型说明例子:
在一个作用域中定义一个string
{//1
string str="123456";//2
}//3
代码运行到在1时,CLR会知道在这个作用域中要的内存空间是多少,在内存中开辟出来了一个线程栈。
代码运行到在2时,可理解为这句话分成了两步:
string str;str="123456";
1,string str;在栈中有了str这个变量,但并没有值。同时也没有对托管堆分配空间。
2,str="123456";先在托管堆中放进"123456"这个字符串,同时分配了在托管堆中的地址NN1,再把NN1放进栈中,这样栈中才存在了值。
代码运行到在3时,作用域结束,然后在代码里,从下到上依次释放作用域中的变量(即清空str变量在栈中的值)。
这时,str变量在栈中就不存在了,但"123456"这个值还是在托管堆中的。
String的说明:
1,字符串的 不可变性
string str="123456";声明了一个变量字符串str,就等于在托管堆中创建了一个"123456"的值
str="555";之后有重新给str赋了另外的值,等于有在托管堆中创建了一个"555"的值,并把地址指向了str,
不可变性就是,不会去修改"123456"的值,而是会新建一个新的值"555"。之后使用时就等于用新的值了。
作者:FengYang
博客地址:http://blog.csdn.net/qq_28140365
版权声明:如果感觉文章哪里写的不对或者存在疑问,欢迎留言,共同学习、进步!
蓝色字体为链接