zoukankan      html  css  js  c++  java
  • C#字符串的不变性

      看过一些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 }

    版权声明

    本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

    如有问题, 请发送邮件和作者联系。

  • 相关阅读:
    HTML元素解释
    Java命名规范
    HDU 1058 Humble Numbers(DP,数)
    HDU 2845 Beans(DP,最大不连续和)
    HDU 2830 Matrix Swapping II (DP,最大全1矩阵)
    HDU 2870 Largest Submatrix(DP)
    HDU 1421 搬寝室(DP)
    HDU 2844 Coins (组合背包)
    HDU 2577 How to Type(模拟)
    HDU 2159 FATE(二维完全背包)
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/4915553.html
Copyright © 2011-2022 走看看