C#字符串的不变性
看过一些C#教程的人都应该知道这句话:“在C#中,一旦对字符串对象进行初始化,该字符串对象就不能再被该变“。这句话可用简单的图示来说明:
1、声明变量 string str="first";
在执行这句代码时,首先在栈上开辟出一块儿内存空间用于存放变量str,然后在堆上开辟出一块儿空间用于存放字符串对象"First",str变量存放指向"First"的引用
注意,str只是string类型的变量,不是字符串对象,堆上的那一坨才是字符串对象。

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

下面使用代码来进行说明(使用ReferenceEquals方法来判断字符串变量的引用是否改变):
using System;
namespace CwjString
{
class Demo
{
static void Main(string[] args)
{
string str01="str01";
string str02=str01;//这时str01和str02指向托管堆上的同一个对象,str01和str02有着相同的引用
System.Console.WriteLine("str01和str02是否有相同的引用?{0}",ReferenceEquals(str01,str02));
System.Console.WriteLine("str01={0},str02={1}",str01,str02); //改变str02的值
//PS:因为字符串的不可变性,这里不会真正的去改变str02的值
//而是在托管堆上重新分配一块儿内存,然后str02指向这个新的string对象
str02="str02";
System.Console.WriteLine("str01和str02是否有相同的引用?{0}",ReferenceEquals(str01,str02));
System.Console.WriteLine("str01={0},str02={1}",str01,str02);
}
}
}
C#字符串的不变性的更多相关文章
- 三张图彻底了解Java中字符串的不变性
转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...
- .Net中字符串不变性与相等判断的特殊场景
今天写bug的时候帮同事解决了一个有趣的问题,可能很多人都会答错.分享给大家. 问题 请看以下例子,并回答问题. var s1 = "12"; var s2 = "12& ...
- 第12章 Java字符串
1.什么是Java中的字符串 字符串String并不是一种数据类型,而是一个类对象,在java.lang包中,只不过在默认情况下java都是自动导入的,所以可以直接使用创建一个String对象的方法有 ...
- .NET面试题解析(03)-string与字符串操作
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 字符串可以说是C#开发中最常用的类型了,也是对系统性能影响很关键的类型,熟练掌握字符串的操作非常重要. 常 ...
- 字符串String类
1. String类是一个密封类.用关键字sealed修饰: 2. 字符串的两个特性: ·不可变性:string类型变量,一旦声明就表明它是不会被改变的.因此,string中的方法对strin ...
- 图说:为什么Java中的字符串被定义为不可变的
8张图,看懂Java字符串的不变性 字符串,想必大家最熟悉不过了,通常我们在代码中有几种方式可以创建字符串,比如:String s = "Hollis";这时,其实会在堆内存中创建 ...
- python学习之初识字符串
刚接触一门语言时,字符串是很容易遇到的, 例如要从读入或者写出, 字符串与数字间的转换等. 由于字符串, 列表和元组等类型具有一定的共性(由对象组成的序列,如字符串是字符序列), 在Python中统称 ...
- 使用"+"进行字符串拼接
本文来自:Hollis(微信号:hollischuang) 字符串,是Java中最常用的一个数据类型了.本文,也是对于Java中字符串相关知识的一个补充,主要来介绍一下字符串拼接相关的知识.本文基于j ...
- Java 字符串 String
什么是Java中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对 ...
随机推荐
- Linux搜索文件夹下所有文件中字符串
1.grep "status_bar_height" * -nR /* 搜索文件中有很多不存在的文件出现 */ 2.grep -nsr "status_bar_heigh ...
- 自定义cell右侧 多按钮
#import "ViewController.h" @interface ViewController () <UITableViewDataSource, UITable ...
- 已经过事务处理的 MSMQ 绑定(转载)
https://msdn.microsoft.com/zh-cn/biztalk/ms751493 本示例演示如何使用消息队列 (MSMQ) 执行已经过事务处理的排队通信. 注意 本主题的末尾介绍了此 ...
- Excel导入导出组件的设计
前言: 距离一篇文章,又八九个月过去了,随着在园子露脸的次数越来越少,正如我们淡忘上一波大神那样,我们也正下一波所淡忘. 这八九个月,前前后,游走在十来个项目上,忙,却找不到成就感. 人过30后,也是 ...
- 从viewport发现小米手机参数不一致
想要在移动web领域有所深造的小伙伴,第一关要过的就是逻辑像素与设备像素之间的关系. 初入移动web,一定要搞懂的几个单位(DPI.PPI.DP.PX 的详细计算方法及算法来源是什么?): dip(d ...
- Google分布式构建软件之二:构建系统如何工作
分布式软件构建第二部分:构建系统如何工作 注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 上篇文章中提到了在Google,所 ...
- C#设计模式之命令
IronMan之命令 在本篇中还是围绕着“IronMan”来讲,在上一篇“外观”中我们说到过“控制中心”.它是负责IronMan的核心,所有能想象到的功能都跟它有关系,就在使用它的时候,发现了一些问题 ...
- Android开发学习之路-回调机制学习笔记
不知道是我学Java的时候没有认真听还是怎么的,曾经一直不知道什么是“回调”,它有什么用,百度一大堆,都太复杂看不明白(好吧是我笨),所以想把自己理解的分享给其他看到的人,大家都真正认识一下这个重要的 ...
- EL
- Android笔记——提升ListView的运行效率
之所以说 ListView 这个控件很难用,就是因为它有很多的细节可以优化,其中运行效率就是很重要的一点.目前我们ListView 的运行效率是很低的,因为在 FruitAdapter 的getVie ...