C# 特殊的string类型详解

 更新时间:2017年02月13日 09:43:05   作者:PowerDK  
本文主要介绍了C# 特殊的string类型。具有很好的参考价值,下面跟着小编一起来看下吧

1.前言

string是属于引用类型的,这个大家都知道吧?但是平常在使用的过程中,发现它还是拥有一些值类型的特征的,这到底是为什么呢?

原因就是.Net考虑到假如大量的操作string对象的时候,大量对引用对象进行操作的时候,性能肯定不如值类型来的爽快。.Net为了提高这个性能,提供了一个专门的解决方案:字符串驻留池!

2.正文

先让我们来看一段代码:

      string str1 = "aa";
      string str2 = "a" + "a";
      Console.WriteLine(ReferenceEquals(str1, str2)); //print:true

这str1跟str2的内存指向地址居然是一模一样的!

原因是.Net在CLR内部维护了一个Hash表(其实就是前文说的字符串驻留池),key为字符串内容,值就是所指向的托管堆的地址;当初始化创建了一个新的字符串的时候,.Net就会去这个Hash表中搜索是否有相同的值,如果key相同,就会把已经存在的字符串的地址值赋给新创建的字符串,如果不存在则重新分配地址,这就是为什么上面这个代码的内存为true。

再让我们来看另外一段代码:

     string str3 = "ab";
     string str4 = "a";
     str4 += "b";
     Console.WriteLine(ReferenceEquals(str3, str4));//print :false

之所以出现了false,请注意上一栏的关键字“初始化创建”,当字符串是动态创建的时候,.Net并不会去Hash表中搜索是否有创建,而是直接创建;

假如想对上面的代码优化一下并且对性能有更(xian)高(de)追(dan)求(teng),我们可以手动将这个字符串加入到字符串驻留池中进行对比

     string str3 = "ab";
     string str4 = "a";
     str4 += "b";
     str4 = string.Intern(str4);//Intern:它会去字符串驻留池中搜索,假如找寻到的话则返回对应的地址
     Console.WriteLine(ReferenceEquals(str3, str4));//print :true

3.总结

最后对string下点结论:

1.string在clr中不是用newobj指令创建,而是用ldstr指令创建!而且string拥有值类型的特征,但是在内存上是引用类型,存在托管堆上面;

2.string是sealed修饰的,所以不能被子类集成;

3.当创建内容相同的时候,string是指向同一地址的,而且每次操作string都会生成新的地址(string的恒定性);

4.对于大量拼接的话还是使用StringBuilder,它是动态的不像string是恒定的,但就是创建StringBuilder代价比较大,所以小拼接用string在性能上可能还更好!

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • c#实现md5加密示例

    c#实现md5加密示例

    这篇文章主要介绍了md5加密,加密结果可以为32位、48位、64位,只要修改一下参数就可以实现
    2014-01-01
  • C#运行程序时阻止关闭显示器和系统待机

    C#运行程序时阻止关闭显示器和系统待机

    这篇文章介绍了C#运行程序时阻止关闭显示器和系统待机的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 如何在C#中使用JIEBA.NET实现中文分词

    如何在C#中使用JIEBA.NET实现中文分词

    JIEBA 是一款优秀的中文分词工具,为了方便 .NET 开发者使用,JIEBA.NET 作为一个封装了 JIEBA 的 C# 库,提供了类似的分词功能,下面我们来看看它的具体操作吧
    2025-03-03
  • c#对xml增删改查操作示例

    c#对xml增删改查操作示例

    本文主要介绍c#对xml增删改查操作的示例,大家参考使用吧
    2014-01-01
  • C#实现航班预订系统

    C#实现航班预订系统

    这篇文章主要为大家详细介绍了C#实现航班预订系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 详解C#实例化对象的三种方式及性能对比

    详解C#实例化对象的三种方式及性能对比

    这篇文章主要介绍了C#实例化对象的三种方式及性能对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Unity实现多平台二维码扫描

    Unity实现多平台二维码扫描

    这篇文章主要为大家详细介绍了Unity实现多平台二维码扫描,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 关于C#继承的简单应用代码分析

    关于C#继承的简单应用代码分析

    在本篇文章里小编给大家整理了一篇关于C#继承的简单应用代码分析内容,有兴趣的朋友们可以学习下。
    2021-05-05
  • C# 崩溃异常中研究页堆布局的详细过程

    C# 崩溃异常中研究页堆布局的详细过程

    最近遇到一位朋友的程序崩溃,发现崩溃点在富编辑器 msftedit 上,这个不是重点,重点在于发现他已经开启了 页堆,由于 页堆 和 NT堆 的内存布局完全不一样,这一篇结合我的了解以及 windbg 验证来系统的介绍下 页堆,需要的朋友可以参考下
    2022-10-10
  • c# 二分查找算法

    c# 二分查找算法

    折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法
    2013-10-10

最新评论