C#中的字符串

1.    值类型与引用类型比较

classProgram

{

    staticvoid Main()

    {

        int a = 9;    //给变量a赋值为9

        int b = a;   //a的副本给变量b

        b = 10;

        Console.WriteLine(string.Format("a={0},b={1}", a, b));

 

        Person ZS = newPerson();       //张三

        ZS.Age = 99;           //张三的年龄是99

        Person SM = ZS;        //三毛等于张三,即张三和三毛就是同一个人

        SM.Age = 100;      //三毛年龄变成100,张三也就变成了100

        Console.WriteLine(string.Format("A={0},B={1}", ZS.Age, SM.Age));

 

        Console.ReadKey();

    }

}

classPerson

{

    publicint Age { get; set; }

}

相同的结构,不同的结果。

 

2.    何以证明string是引用类型

区分值类型与引用类型就是看它是值传递还是引用传递,如下:

using System;

classProgram

{

    staticvoid Main()

    {

        int n = 99;

        Console.WriteLine("Beforen={0}", n.GetHashCode());

        //此时获取到的哈希码值就是n的变量值

        GetInt(n);

 

        string s = "Hello";

        Console.WriteLine("Befores={0}", s.GetHashCode());

        GetString(s);

 

        Console.ReadKey();

    }

 

    staticint GetInt(int n)

    {

        Console.WriteLine("Afterm={0}", n.GetHashCode());

        //传过来的是变量值,说明这是值传递

        return n;

    }

 

    staticstring GetString(string s)

    {

        Console.WriteLine("Afters={0}", s.GetHashCode());

        //传过来的是地址而不"Hello",说明这时引用传递

        return s;

    }

}

 

3.    string是特殊的引用类型

为什么说string是特殊的引用类型,因为看了下面的运行结果你会很困惑,这是怎么回事呢?且看代码分析:

    classProgram

    {

        staticvoid Main()

        {

            string a = "Hello ";

            Console.WriteLine(a.GetHashCode());

            //定义一个变量a,(暂且用哈希码表示地址编号)地址编号为1402305,指向对象的值为“Hello”

 

            string b = a;

            Console.WriteLine(b.GetHashCode());

            //a的地址给b,所以b的地址也是1402305

 

            b = "world";

            Console.WriteLine(b.GetHashCode());

            //string类型的值三只读的,当给他重新赋值的时候需要额外分配内存,同时地址也发生变化。这也就是string类型和一般引用类型的不同之处

            //可以这么理解,字符串变量吃饭用一次性碗筷,这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=

 

            Console.WriteLine("a:"+a+"\nb:"+b);

            //此时有两个地址,分别对应托管堆上两个不同的对象值

            Console.ReadKey();

        }

}

运行结果:

 

请思考下面代码的运行结果:

        staticvoid Main()

        {

            string s = "Hello";

            ChangeStr(s);//调用方法  

            Console.WriteLine(s);

        }

        staticvoid ChangeStr(string s){s = "你好!";}

答案:?

   //ChangeStr方法体内传过来的确实是引用地址,但是由于string是只读的,给他重新赋值的时候又重新分配了新地址,而对原来地址和所对应的值没有影响

 

那怎么定义string的值传递方法呢?

staticstring ChangeStr(refstring s)

 

4.    string是一个变态类型

string是特殊的引用类型是出于客气,写到这我就不能不破口大骂string是个变态狂了,Look

classProgram

{

    staticvoid Main()

    {

        string S1 = "Hello";

        string S2 = "Hello";

        bool r1 = object.ReferenceEquals(S1, S2);

 

        var A = new { Age = 12 };   //对象A

        var B = new { Age = 12 };   //对象B

        bool r2 = object.ReferenceEquals(A, B);

 

        Console.WriteLine("r1={0}r2={1}", r1, r2);

        Console.ReadKey();

    }

}

运行结果真的让人出乎意料,同样是引用类型,string总是和别人不一样。

 

消消气,理智一点分析,其实这就是string的内存驻留机制  ,也就是CLRstring做的优化(当有多个字符串变量包含了相同的值时, CLR尽可能不要重复地分配内存,而是让它们统统指向同一个字符串对象实例)。

staticvoid Main()

 {

    string p = "Hello";

    string q = new StringBuilder().Append("Hello").ToString();

    Console.WriteLine(object.ReferenceEquals(p, q));

    //由于声明方式不同,所以CLR不会检查驻留池是否存在相同的变量值

    Console.ReadKey();

 }

 

staticvoid Main()

 {

    string p = "Hello";

    string q = new StringBuilder().Append("Hello").ToString();

    string o = string.Intern(q);  //强制CLR检查驻留池

    Console.WriteLine(object.ReferenceEquals(p, o));

    Console.ReadKey();

 }

                                                                                                         ---- Author:Hollson     QQ:498576940

转载于:https://www.cnblogs.com/Hollson/p/3276682.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初二计算机辅导记录,信息技术指导老师的讲课笔记十篇(2)

2.教师观念转变多数学生可深入学习新课改模式,积极转变自己的理念,能够在教学上推动角色的转变,成为教师学习的引导者、组织者、合作者。如龙北四小一年级数学老师刘阳让学员观察统计表,提出数学难题,并进行计算&#…

linux nfs配置

这节我们介绍NFS的相关概念,以及如何配置NFS和在客户端中查看NFS。NFS的配置过程很简单。在服务器端中编辑/etc/exports文件,添加如下内容:/home/nfs-share 192.168.1.122 *(rw,sync) 第一项是要共享的目录,后者为共享的配置参…

1080i、1080p、2K、4K是什么意思?

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 一、数字后面的字母含义 “I”指的是“Interlaced scanning”,即隔行扫描;P指的是“progressive scanning”,即逐行扫描。这两个概念是需要电子枪进行扫描的大背头电视的…

昂着头的艺术-伯爵在城堡的日记

原文请看:http://www.douban.com/note/275619382/ 《昂着头的艺术》文/伯爵在城堡(原载于《全球商业经典》2013年4月刊)2003 年夏天,电视里到处是带着口罩的“面具侠”,连广告都比平常更少了。远在海南出差的老妈半夜两点钟打来一…

河南面试分数怎么计算机,河南省现行教材(小学计算机面试教案).doc

河南省现行教材(小学计算机面试教案)课 题 1、电子报刊设计课 型 新授课1、掌握艺术字、文字分栏、图文混排等的制作方法。2、锻炼学生利用已有素材进行综合设计的能力。3、培养学生保护环境的意识和责任。教学重点掌握艺术字、文字分栏、图文混排等的制作方法。教学难点掌握艺…

Zabbix中文模式:图片下面的字符乱码

2019独角兽企业重金招聘Python工程师标准>>> Zabbix默认字体放在安装目录的fonts下: # ll fonts/ total 21288 -rw-r--r-- 1 www www 21767952 Jun 11 2009 DejaVuSans.ttf 从windows机器上拷贝一个字体替换掉就可以了,如使用"微软雅黑…

计算机常用存储芯片分为内存和什么,计算机类论文范例,与安徽省计算机一级考试宝典相关研究生毕业论文开题报告范文...

计算机类论文范例,与安徽省计算机一级考试宝典相关研究生毕业论文开题报告范文关于计算机及计算机系统及山东自考方面的免费优秀学术论文范文,计算机类论文答辩开场白,关于安徽省计算机一级考试宝典相关论文范例,对写作计算机论文范文课题研究的大学硕士…

2013网易实习生招聘笔试题

选择题: 1、二维数组int a[3][4],下列能表示a[1][2]的是? A.*(*(a1)2) B.*(a3) C.(&a[0]1)[2] D.(a[0]1) 2、short a[100],则sizeof(a)的值是? A.2 B.4 C.200 D.400 问答题: 1、解释…

插入排序---希尔插入排序算法(Javascript版)

取一个小于n的整数作为第一个增量&#xff0c;把序列分组。所有距离为增量的倍数的元素放在同一个组中。先在各组内进行直接插入排序&#xff1b;然后&#xff0c;取第二个增量&#xff08;第二个<第一个&#xff09;重复上述的分组和排序&#xff0c;直至所取的增量1&#…

“视频编码”的相关概念

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 1、视频编码是什么意思&#xff1f; 视频编码&#xff0c;就是指通过特定的压缩技术&#xff0c;将某个视频格式的文件转换成另一种视频格式文件。 &#xff08;能否这样理解&#xff0c;视频编码&#xff0c;约…

常量和字段

常量是一个特殊的符号&#xff0c;它有一个从不变化的值。定义常量符号时&#xff0c;它的值必须能在编译时确定。确定之后&#xff0c;编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。在C#中一下类型都是基元类型&#xff0c;可用于定…

简单实用的二级树形菜单hovertree

原创 hovertree是一个仿京东的树形菜单jquery插件&#xff0c;暂时有银色和绿色两种。官方网址&#xff1a;http://keleyi.com/jq/hovertree/欢迎下载使用查看绿色效果&#xff1a;http://keleyi.com/jq/hovertree/hovertreegreen.htm可以设置菜单宽度(width)&#xff0c;还可以…

分析根文件系统中的目录结构

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 我们利用Busybox制作根文件系统&#xff0c;就是为了创建下面的这些目录和各文件。其中有些目录和文件不是构建最小根文件系统所必需的&#xff0c;有些却是必需的。 1、/linuxrc文件 这是最重要的文件&#xff0c…

xp系统一直跳出宽带连接服务器,XP系统网络问题解决方案

XP系统网络问题解决方案随着国内 Internet 的普及和信息产业的深化&#xff0c;近几年宽带网络的发展尤为迅速。下面是小编整理的一些生活上Windows XP网络故障的解决方案&#xff0c;希望对你有帮助!故障1&#xff1a;本地连接受限制或无连接很多用户发现&#xff0c;当每次进…

装逼的翻译,害死多少人,你同意吗?到底什么是非终止状态,终止状态

http://msdn.microsoft.com/zh-cn/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx 很久以前对这段翻译就很不爽了&#xff0c;为啥一直都要把non-signaled的翻译成“非终止状态”&#xff0c;为…

SQL Server 错误18456

第一步、 错误发生的场景 第二步、 找到引起错误的原因 第1步、 查看windows日志文件。 运行中输入 eventvwr (event viewer)打开日志文件查看器, 第三步、 解决方案&#xff0c;由第二步我们可以看出是SQL Server的认证模式引起了问题&#xff0c;所以只要把它改一下就可以…

数组面试

1.数组求和 如果只是普通求和会简单&#xff0c;但是只能使用一行代码该怎么办呢&#xff1f; int sum(int *a,int n) {return n 0 ? 0 : sum(a,n-1) a[n-1]; }2.寻找发帖水王 int Find(int *a,int n) {int times 0;int value;for (int i 0;i < n;i){if (times 0){val…

分析根文件系统中的etc/init.d/rcS文件

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、文件简介 &#xff08;1&#xff09;由博文分析根文件系统中的/etc/inittab文件可知&#xff0c;etc/inittab文件的第一行配置项一般是“::sysinit:/etc/init.d/rcS”&#xff0c;这说明控制台…

拼多多显示内部服务器错误是怎么回事,拼多多提现出现错误怎么办?拼多多提现常见问题...

拼多多提现是每个店家都会去操作的&#xff0c;不过提现时总会遇到很多问题&#xff0c;例如手机号码换了收不到验证码、提现资金到账时间、提现出现错误等等&#xff0c;当然还有很多。当这些问题出现时我们应该如何去解决呢?1、如果出现银行提现手机号非现使用手机号&#x…