c#String的不变特性,可读但不可写性
谈到字符串,大家自然觉得简单,但是总是有一些小的问题隐约出现,下面我就系统的说一下字符串的问题,有说不到日后再予补充。
1,首先String是一个类,string只是String类的一个别名,别名的意思:另一个代号,就是和String一样使用。
2,string str=“abc”,和char[] cha={'a','b','c'}的不同。大家不要简单认识一个字符串就是一个字符数组。要理解本质。
就是字符串的不变性,string只是可读,但不可写。但字符数组可读可写。
可读:字符串中的str[0]=a str[1]=b str[2]=c,字符中的str[0]=a str[1]=b str[2]=c,
可写:字符串里的元素是不可写的
class Program
{
static void Main(string[] args)
{
char[] cha = { 'a', 'b', 'c' };
Console.WriteLine(cha[0]);
cha[0] = 'b';
Console.WriteLine(cha); string str = "abc";
Console.WriteLine(str[0]);
// str[0] = 'd';
Console.ReadKey();
}
若str[0]='d';将会报“错误 1 无法对属性或索引器“string.this[int]”赋值 -- 它是只读的“字符数组可以。
这里有人提出,str=“abc”;str+=“d”,Console.WriteLine(str);出现abcd;这不是表明字符传可以更改吗?可写吗?
下面咱们就针对这个问题自习分析一下。

看到这个图,相比大家大家明白了字符串的不变性。再来个图证明这个不变性。

3,这里又一次证明了字符串不可变性,另外提出一个问题,那就是字符串的“暂存池”的概念。
string str=“abc”;string str1=“abc”两者指的是同一个对象。
但是这仅仅是string str=“abc”;string str1=“abc,而不是char[] cha={'a','b','c'}; string str=new string(cha);

在调试的时候打开监视窗口,输入*变量,监视变量的地址,两者是同一地址,证明指向的同一变量。下图不同地址,自然不同变量。

总结,处理字符串 一定要有接受他的返回值,因为每处理一次,就会产生一个对象。
常常将字符串实例,ToCharArray();然后再调用string的(char[])构造函数。“修改”字符串中的元素。
问题:这里会让我们想到值传递和引用传递的用法。以后再予更新。
4,
string str=null;
str="";
string str1=string.Empty;
string str2="";
string str3=“ ”;//有个空格


运行过str=null后,str的地址没有变化,依然是0x00000000,所以说,没有分配内存空间。
运行完后,如上图显示,证明string.Empty和“”是一样的,当然也和先赋null,再“”一样。但是拥有一个空格字符就不同了。
//string a = "abc";
//char[] ch = { 'a', 'b', 'c' };
//string a = new string(ch);
string a = "abc";
string b = a;
b+="def";
Console.WriteLine(a);//abc //new方法得到一样的结果
Console.WriteLine(b);//abcdef
Console.ReadKey();
c#String的不变特性,可读但不可写性的更多相关文章
- C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步
摘要:C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景.该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定, ...
- laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题
在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...
- 使用ReaderWriterLock类实现多用户读/单用户写同步
使用ReaderWriterLock类实现多用户读/单用户写同步[1] 2015-03-12 应用程序在访问资源时是进行读操作,写操作相对较少.为解决这一问题,C#提供了System.Threadin ...
- operator[],识别读操作和写操作
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- HBase 的Get(读),Put(写),Delete(删),Scan(扫描)和Increment(列值递增)
一.HBase介绍 1.基本概念 HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平 ...
- 事务ACID特性,其中I代表隔离性(Isolation)。
事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...
- 改动Oracle GoldenGate(ogg)各个进程的读检查点和写检查点
请注意:请谨慎改动Oracle GoldenGate(ogg)各个进程的读检查点和写检查点. 请确保已经 掌握 ogg 各个进程的读检查点和写检查点的详细含义. BEGIN {NOW | yyyy-m ...
- 【转】Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法
chmod是更改文件的权限 chown是改改文件的属主与属组 chgrp只是更改文件的属组. 一.文件权限解读 如上图所示,开头的-rwxrw-r--这一字符串标识文件权限. 这个字符串有10位,可以 ...
- switch case :在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了
switch的case语句可以处理int,short,byte,char类型的值, 因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出. char a = 'e ...
随机推荐
- HDU 4059 容斥原理+快速幂+逆元
E - The Boss on Mars Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- C++动态内存管理之shared_ptr、unique_ptr
C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...
- C++基础(2)
c++规定如果一个类对象是另外一类的数据成员,那么在创建对象的时候系统将自动调用那个类的构造函数. 析构函数的定义:析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只 ...
- SQL with as
姓名 课程 分数 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 先看下面一个嵌套的查询语句 ) 上面的查询语句使用了一个子查询.虽然这条SQL语句并不复杂,但如果嵌套的层次过 ...
- Android判断App是否在前台运行(转)
原文地址: http://blog.csdn.net/zuolongsnail/article/details/8168689 Android开发中,有时候需要判断App是否在前台运行. 代码实现如下 ...
- SqlServer 临时表 与 表变量(转)
1. 表变量 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime).以@前缀的表变量是本地的,因此 ...
- Eclipse开发,利用WordWrap设置自动换行
安装 WordWrap : Help → install new Software→http://ahtik.com/eclipse-update/ 安装成功后,重启Eclipse,鼠标右键开启自动换 ...
- 2016.6.20 计算机网络复习要点第三章之CSMA/CD协议
1.最早的以太网是将许多计算机都连接到一根总线上: (1)总线的特点是:当一台计算机发送数据时,总线上的所有计算机都检测到这个数据,这种就是广播通信方式: (2)为了实现在总线上的一对一通信,可以使每 ...
- Javascript的对象封装和继承有哪些方法?优劣分别是什么?
1.对象封装方法 (1)原始模式生成对象 直接将我们的成员写入对象中,用函数返回. 缺点:很难看出是一个模式出来的实例. function Stu(name, score) { ...
- Storm Grouping —— 流分组策略
Storm Grouping: Shuffle Grouping :随机分组,尽量均匀分布到下游Bolt中 将流分组定义为混排.这种混排分组意味着来自Spout的输入将混排,或随机分发给此Bolt中的 ...