C#中如何使用String对象

发布时间:2021-07-07 16:19:58 作者:Leah
来源:亿速云 阅读:123

C#中如何使用String对象,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

把一个字符串变量赋给另一个字符串时,就会创建一个全新的C# String对象,就是说这个时候就会有两个对象,比如:

classStringExc  {  publicstaticvoidMain()  {  strings1="originalstring";  strings2=s1;//注意此时会创建一个新对象  Console.WriteLine("s1is"+s1);  Console.WriteLine("s2is"+s2);  s1="changedstring";  Console.WriteLine("s1isnow"+s1);  Console.WriteLine("s2isnow"+s2);  }  }

输出结果为:

s1isoriginalstring  s2isoriginalstring  s1isnowchangedstring  s2isnoworiginalstring

也就是说,改变s1的值并没有对s2造成任何影响,这与我们平时所说的引用类型的行为正好相反。当用值"original string"初始化s1时,就在堆上分配了一个C# String对象。在初始化s2时,引用也指向这个对象,所以s2的值也是"original string"。但是现在要改变s1的值,而不是替换原来的值时,堆上就会为新值分配一个新对象。s2变量仍然指向原来的对象,所以它的值没有改变。

另外,如果我们像下面这样:

stringstr1="abc";  stringstr2="abc";

当我们用System.Object.Equals(str1,str2)比较时,返回值是true;按理说str1和str2应该指向不同的空间,应该返回false才对啊。原来Equals有三个版本:

publicoverrideboolEquals(object);  publicboolEquals(string);  publicstaticboolEquals(string,string);

前两个实例方法内部会调用CompareOrdinal静态方法,它会字符串中的各个字符,如果相等就返回true。第三个首先会检查两个引用指向的是否是同一个对象,如果是,就返回true,不再去比较各个字符了。

其实CLR使用了一种叫字符串驻留的技术,对于

string   str1="abc";  string   str2="abc";

当CLR初始化时,会创建一个内部的散列表,其中的键为字符串,值为指向托管堆中字符串的引用。刚开始,散列表为空,JIT编译器编译方法时,会在散列表中查找每一个文本常量字符串,首先会查找"abc"字符串,并且因为没有找到,编译器会在托管堆中构造一个新的指向"abc"的C# String对象引用,然后将"abc"字符串和指向该对象的引用添加到散列表中。

接着,在散列表中查找第二个"abc",这一次由于找到了该字符串,所以编译器不会执行任何操作,代码中再没有其它的文本常量字符串,编译器的任务完成,代码开始执行。执行时,CLR发现***个语句需要一个"abc"字符串引用,于是,CLR会在内部的散列表中查找"abc",并且会找到,这样指向先前创建的C# String对象的引用就被保存在变量s1中,执行第二条语句时,CLR会再一次在散列表中查找"abc",并且仍然会找到,指向同一个C# String对象的引用会被保存在变量s2中,到此s1和s2指向了同一个引用,所以System.Object.Equals(s1,s2)就会返回true了。

看完上述内容,你们掌握C#中如何使用String对象的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. C# 中string 和 String的区别
  2. C++中string类对象如何使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

string

上一篇:C# 中怎么利用ODBC访问MySQL数据库

下一篇:C#中怎么读取文件夹中的文件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》