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 }

    版权声明

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

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

  • 相关阅读:
    TomCat 的 Jenkins 报错:反向代理设置有误
    【Django】如何在类视图、普通视图单独不做CSRF校验
    【Django】HTML如何显示富文本内容
    Djaong 运行报错:ValueError: Unable to configure handler 'default'
    Windows 环境使用 Xshell 连接 VMware 虚拟机上的 CentOS 系统
    【我的青春我做主】让自己的心境安宁
    Django 使用 Nginx + uWSGI 启动
    Django_文件下载
    追梦何须要问成败,只管向前吧
    PyCharm:设置py文件头部信息
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/4915553.html
Copyright © 2011-2022 走看看