C#中String StringBuilder
String和StringBuilder和StringBuffer,这三个都是值得深究一翻的,可能很多人会说,实在不行的话,都全部用StringBuilder,啥事没有,我不能说你的想法事不正确的,但是我可以给出更好的建议。下面简单介绍一下这三个类。
String类
在我们平时的使用当中很容易不注意到的是,自己写的代码很容易发生了装箱的操作(把值类型转换为引用类型)。就比如很常见的,一个字符串拼接
string str=9+"test"; 通过查看IL代码可以知道这里发生了装箱的操作。所以建议使用(在把值类型转换为字符串的时候,记得用ToString方法)。所以平时写代码的时候,要注意下,装箱和拆箱的操作(之后推出的泛型集合不就是为了解决装箱和拆箱的操作)。装箱操作的过程:把值类型放到托管堆里面分配内存,除了值类型本身所分配的内存外,内存总量还要加上类型对象指针和同步索引块所占用的内存,之后再将值类型的值重新分配到堆内存当中,最后再返回引用类型的对象的地址。
我们知道很多类型(值类型)都自带了一个ToString方法,为毛用这个就不会发生装箱操作呢,很简单的一个道理,不是有人和你说String是特殊的值类型(虽然他是引用类型),C#语言的设计者,为了做到这一点,他想出了这个方法
把String对象,一旦赋值就不可改变(叫做字符串的恒定性),赋值完了之后,再对String进行拼接,赋值等,都会再内存里面重新分配一个新的内存空间。
StringBuilder
基于上面的问题,string类在重新赋值会重新去分配内存空间,所以为了解决这个问题,微软推出了一个StringBuilder的类。可以看看StringBuilder类是如何做到不重新分配内存的呢。
通过阅读StringBuiler类的实现,我们可以发现
internal const int DefaultCapacity = 0x10; StringBuilder类,默认的大小是16,意思就是说我们如果不指定StringBuilder长度,超过16个长度,就会重新去分配一次内存。具体实现可以看看StringBuilder类的Append源码。
从代码里面可以看出,我们平时用StringBuilder的时候,一定要指定合适的长度。源码里面的fixed语句块(通俗的来讲,可以禁止垃圾回收把变量地址给回收了)。
总结:平时写代码的时候应该要注意装箱拆箱操作,注意stringBuilder的使用。
C#中String StringBuilder的更多相关文章
- Java中String, StringBuilder和StringBuffer
Java中常用来处理字符串的类有三个: String, StringBuffer和StringBuilder. 区别 三者都继承自CharSequence接口, 首先说明三者间主要区别 String字 ...
- java中String StringBuilder StringBuffer比较和效率(性能)测试
string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...
- java中string stringbuilder stringbuffer 的区别
1. String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a&qu ...
- 关于String中+与StringBuilder的问题
字符串连接可以通过两种方法实现,其中一种是在Java中提供的一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用StringBuffer类). 字符串是Java程序 ...
- java中String、StringBuffer、StringBuilder的区别
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- java中String类、StringBuilder类和StringBuffer类详解
本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html 版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...
- Java中string拼接,StringBuilder,StringBuffer和+
Java中string拼接,StringBuilder,StringBuffer和+,到底哪个更合适? StringBuilder线程不安全,效率较线程安全的StringBuffer高.jdk1.5之 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
随机推荐
- gin中运行多个服务
运行服务的返回类型为 :http.Handler .gin.New(),gin.Default() 返回的就是此类型.使用&http.Server{....} 设置服务参数使用g.Go(fun ...
- servlet单例模式以及servlet的请求流程
目录 一.servlet 单例模式: 二.servlet的请求流程: ★ 流程: ★ 详细过程如下: 一.servlet 单例模式: tomcat服务器,通过Java的反射机制来自动调用servl ...
- 原生js获取子元素
感谢原文作者:归一山人 原文链接:https://www.cnblogs.com/guiyishanren/p/12214757.html 获取子元素的方法有 //获取第一个demo类 dom = d ...
- Android 存储到SD卡,获取SD的大小及可用空间
使用Sdcard注意事项: 1.权限问题: <uses-permission android:name="android.permission.WRIT ...
- 安装Varnish 及遇到的坑
转自:http://ixdba.blog.51cto.com/2895551/682555 一.安装Varnish Varnish的安装非常简单,下面逐步介绍: 1.安装前的准备 Varni ...
- Cadence物理库 LEF 文件语法学习【持续更新】
我是 雪天鱼,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". @ 目录 一.LEF简介 1.1 通用规则 1.2 管理 LEF 文件 二. ...
- 虫师Selenium2+Python_3、Python基础
P38--Python哲学 打开Python shell,输入import this,会看到下面的话: The Zen of Python, by Tim Peters Beautiful is ...
- netstat 竟然还能这么玩儿?
一次摸鱼的机会,看到群里小伙伴问了一嘴 netstat -tnpl 这个命令是干啥的,这个命令用过很多,但是我其实也没有认真研究过,但是这是一个问题,我不能放过它,而且 netstat 这个命令我日常 ...
- 海康PTZ云台摄像头调试之直接控制云台(C#)
众所周知,海康的摄像头sdk较为完善,但是对于新手来说还是有点麻烦. 今天写一篇随笔给大家展示下怎么控制海康摄像头的云台(前提是有ptz云台设备) 1.sdk准备 本文基于C#的frame来开发一个p ...
- Solution -「Ynoi 2018」「洛谷 P4117」五彩斑斓的世界
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),处理 \(m\) 次操作: 给定 \(l,r,x\),把 \([l,r]\) 内所有 \(&g ...
