C# 特殊的string类型详解

作者:PowerDK 时间:2022-02-10 14:11:59 

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在性能上可能还更好!

来源:http://www.cnblogs.com/powerdk/p/6391024.html

标签:C#,string类型
0
投稿

猜你喜欢

  • mybatis使用Integer类型查询可能出现的问题

    2022-09-01 12:47:38
  • Java线程的全方位详解

    2023-04-11 14:02:55
  • java实现学生成绩档案管理系统

    2023-06-29 22:48:43
  • Java编程接口回调一般用法代码解析

    2023-11-11 06:55:11
  • 原来Java中有两个ArrayList

    2023-06-27 11:49:40
  • Struts2下拉框实例解析

    2021-09-16 16:29:59
  • Java基础之final关键字作用案例

    2022-11-02 19:23:35
  • 简单了解Java编程中抛出异常的方法

    2023-08-07 17:31:49
  • Spring Boot 2.5.0 重新设计的spring.sql.init 配置有啥用

    2021-12-04 00:04:43
  • Spring实现动态切换多数据源的解决方案

    2023-05-21 13:07:15
  • 浅谈mybatis中SQL语句给boolean类型赋值问题

    2023-01-19 15:15:42
  • Struts中使用validate()输入校验方法详解

    2023-03-02 19:10:41
  • SpringCloud消息总线Bus配置中心实现过程解析

    2023-02-14 10:05:18
  • Java C++ 算法题解leetcode669修剪二叉搜索树示例

    2022-09-22 04:56:13
  • Java安全框架——Shiro的使用详解(附springboot整合Shiro的demo)

    2022-05-29 09:46:46
  • Java实现图片拼接

    2023-02-28 23:01:27
  • 解决Java & Idea启动tomcat的中文乱码问题

    2022-05-31 05:48:35
  • Spring Security OAuth2 实现登录互踢的示例代码

    2023-09-04 19:09:28
  • JVM教程之内存管理和垃圾回收(三)

    2023-11-10 15:49:54
  • java.sql.Date和java.util.Date的区别详解

    2023-11-28 16:15:09
  • asp之家 软件编程 m.aspxhome.com