码迷,mamicode.com
首页 > Windows程序 > 详细

C#字符串的不变性

时间:2015-10-27 22:12:14      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

  看过一些C#教程的人都应该知道这句话:“在C#中,一旦对字符串对象进行初始化,该字符串对象就不能再被该变“。这句话可用简单的图示来说明:

  1、声明变量 string str="first";

    在执行这句代码时,首先在栈上开辟出一块儿内存空间用于存放变量str,然后在堆上开辟出一块儿空间用于存放字符串对象"First",str变量存放指向"First"的引用

    注意,str只是string类型的变量,不是字符串对象,堆上的那一坨才是字符串对象。

技术分享

  2、改变变量str的值,str="Second";

     在执行这句代码时,会在堆上开辟出一块儿新的内存空间用来存放新对象“Second”,str指向新对象地址,原来的对象“First”并没有改变,该对象在不再被使用的情况下,将被垃圾回收器回收。

 

  技术分享

下面使用代码来进行说明(使用ReferenceEquals方法来判断字符串变量的引用是否改变):

 1 using System;
 2 namespace CwjString
 3 {
 4     class Demo
 5     {
 6         static void Main(string[] args)
 7         {
 8             string str01="str01";
 9             string str02=str01;//这时str01和str02指向托管堆上的同一个对象,str01和str02有着相同的引用
10             System.Console.WriteLine("str01和str02是否有相同的引用?{0}",ReferenceEquals(str01,str02));
11             System.Console.WriteLine("str01={0},str02={1}",str01,str02);
12             
13             //改变str02的值
14             //PS:因为字符串的不可变性,这里不会真正的去改变str02的值
15             //而是在托管堆上重新分配一块儿内存,然后str02指向这个新的string对象
16             str02="str02";
17             System.Console.WriteLine("str01和str02是否有相同的引用?{0}",ReferenceEquals(str01,str02));
18             System.Console.WriteLine("str01={0},str02={1}",str01,str02);
19         }
20     }
21 }

 

C#字符串的不变性

标签:

原文地址:http://www.cnblogs.com/Cwj-XFH/p/4915553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!