谈到字符串,大家自然觉得简单,但是总是有一些小的问题隐约出现,下面我就系统的说一下字符串的问题,有说不到日后再予补充。

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的不变特性,可读但不可写性的更多相关文章

  1. C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步

    摘要:C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景.该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定, ...

  2. laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题

    在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...

  3. 使用ReaderWriterLock类实现多用户读/单用户写同步

    使用ReaderWriterLock类实现多用户读/单用户写同步[1] 2015-03-12 应用程序在访问资源时是进行读操作,写操作相对较少.为解决这一问题,C#提供了System.Threadin ...

  4. operator[],识别读操作和写操作

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. HBase 的Get(读),Put(写),Delete(删),Scan(扫描)和Increment(列值递增)

    一.HBase介绍 1.基本概念 HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平 ...

  6. 事务ACID特性,其中I代表隔离性(Isolation)。

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  7. 改动Oracle GoldenGate(ogg)各个进程的读检查点和写检查点

    请注意:请谨慎改动Oracle GoldenGate(ogg)各个进程的读检查点和写检查点. 请确保已经 掌握 ogg 各个进程的读检查点和写检查点的详细含义. BEGIN {NOW | yyyy-m ...

  8. 【转】Linux中文件的可读,可写,可执行权限的解读以及chmod,chown,chgrp命令的用法

    chmod是更改文件的权限 chown是改改文件的属主与属组 chgrp只是更改文件的属组. 一.文件权限解读 如上图所示,开头的-rwxrw-r--这一字符串标识文件权限. 这个字符串有10位,可以 ...

  9. switch case :在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了

    switch的case语句可以处理int,short,byte,char类型的值, 因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出. char a = 'e ...

随机推荐

  1. C++ 提取字符串中的数字

    C++ 提取字符串中的数字 #include <iostream> using namespace std; int main() { ] = "1ab2cd3ef45g&quo ...

  2. Liz Murray成功故事的偶然与必然(转)

    偶尔,我看到了一部电影:Homeless to Harvard (风雨哈佛路) 说句老实话,她( Liz Murray 莉丝·默里 )的经历确实让人钦佩和学习! 下面我看到他人写的有这本电影的评论,觉 ...

  3. Rap 安装和配置

    本机环境 系统:CentOS 6.7 64 位 MySQL 5.6 JDK 1.8 Tomcat 8 Redis 3.0.7 Rap 0.14.1 Rap 说明 官网:https://github.c ...

  4. Java Hour 29 Weather ( 2 ) Maven

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 29 Weather 界面 数据源采用上次取得的杭州天气的json. ...

  5. webpack入门--前端必备

    webpack入门--前端必备 什么是 webpack? webpack是一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来 ...

  6. 关于P,V操作理解的分析

      P-V操作定义: 假设sem是个整型变量. P原语的主要操作是: (1)sem减1: (2)若sem减1后仍大于或等于零,则该进程继续执行: (3)若sem减1后小于零,则该进程被阻塞,在相应队列 ...

  7. HTTP基础04--web服务器

    单台虚拟主机实现多个域名 由于虚拟服务器的功能,一台HTTP服务器可以搭建多个Web站点: 在互联网上,域名通过 DNS 服务映射到 IP 地址(域名解析)之后访问目标网站.当请求发送到服务器时,已经 ...

  8. AppleWatch开发教程之调试程序使用帮助文档

    AppleWatch开发教程之调试程序使用帮助文档 AppleWatch开发教程之调试程序 调试又被称为排错,是发现和减少程序错误的一个过程.在Xcode中进行调试的需要实现以下几个步骤: 1.添加断 ...

  9. Jquery操作

    一.文档操作 1.内部插入:append(),appendTo(),prepend(): 2.外部插入:after(),before(): 3.删除操作:remove(),empty(): 4.克隆操 ...

  10. 错误3 error C3859: 超过了 PCH 的虚拟内存范围;请使用“-Zm120”

    在工程上单击右键,属性,C/C++,最后一项,命令行,在里面/Zm200或者编译器提示的大小解决.