c#中关于string的特性介绍以及注意事项
前言
string类型在我们实际项目开发中是一个最使用的类型,string是一个引用类型这一点大家都知道,但是在实际使用过程中,大家会发现string和我们常见的引用类型使用还真不一样,看下面的一个简单例子:
static void Main(string[] args)
{
string hello = "my name is yuanHong";
Console.WriteLine(string.Format("加工前的值:{0}", hello)); ///// 对hello进行加工
MachHello(hello); Console.WriteLine(string.Format("加工后的值:{0}", hello)); Console.ReadLine();
} /// <summary>
/// 对hello进行加工
/// </summary>
/// <param name="hello"></param>
private static void MachHello(string hello)
{
hello = string.Format("{0},Nice to meet you",hello);
}
程序运行的实际结果是:前后值都一样没有发生改变,如果按照引用类型看分析,也该是加工前后期值是不一样的,那是为什么呢?是不是有一种感觉字符串又像是值类型呢?好下面我们就一起探讨一下string的特殊性所在。
string内部实现简介
首先:是要说明的是string是被sealed修饰,不能继承。
其次:通过上面的string底层源码,我们发现,在底层实现上实际上是用的char数组来实现,在初始化一个字符串时,系统都已经初始化了char数组的大小。
string在创建时都固定化了大小,并且是只读,不能修改
在实际使用过程中,我们对string的改变,实际上在内部是重新创建了一个新的字符串
字符串在作为函数参数传递时,实际上是拷贝了一份数据传递
最后:现在我们在回头看最开的程序结果我们就不难明白其为什么会出现这样的现象了
string使用注意点
1、避免额外的存储空间开销
避免用+号来拼接字符串:
看下面的一个实例:
string str1 = "yuan";
str1 = str1 + "hong";
//// 这样会创建两个字符串3个字符串对象 string strNew = "yuan" + "hong";/// 等效于 strNew="yuanhong",其实在编译后也就是这个效果
//// 只会创建一个字符串对象
再看一个实例:
//// 下面是两种方式实现返回一个字符串123 //// 方式1
string v11="";
string v22=v11+"";
string v33=v22+"";
retun v33;
//// 采用方式1:系统会创建5个string对象 //// 方式2
//// 采用方式2:系统只会创建4个string对象
string v1="";
string v2="";
string v3="";
retun v1+v2+v3; //// 从内存开销谁行来说,明显方式2要优于方式1
在实际开发中,如果对字符串对象频繁的拼接操作,建议使用StringBuilder
当然c#中也有一只简化字符串拼接方式:String.Format ,其实其内部实现原理也就是 StringBuilder
2、尽量少的装箱
直接上代码实例:
string str1 = "yunghong" + ; string str2 = "yunghong" + .ToString(); //// 查看编译后的代码,发现第一行代码,需要有一个装箱操作,装箱操作,需要增加不必要的内存开销,第一:需要给值类型本身分布内存,同时还要给类型指针和同板块索引分配内存开销
总结:
在实际开发中需要注意一下几点:
1、避免装箱操作
2、避免使用+号拼接字符串
c#中关于string的特性介绍以及注意事项的更多相关文章
- JAVA 中关于String的特性
一.初始化String的两种方式 String str1 = "hello"; String str2 = new String("hello"); 第一种方式 ...
- Delphi中String类型原理介绍
Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...
- Vue.js源码中大量采用的ES6新特性介绍:模块、let、const
1 关于ES6 ECMAScript6(以下简称ES6)是JavaScript语言的最新一代标准,发布于2015年6月,因为ECMA委员会决定从ES6起每年更新一次标准,因此ES6被改名为E ...
- Android 中常见控件的介绍和使用
1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- VC++ 标准C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- [C++][语言语法]标准C++中的string类的用法总结
转自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 要想使用标准C++中string类,必须要包含 #include ...
- Java中的String与常量池[转帖]
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- Java中的String与常量池
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
随机推荐
- 【ADO.NET基础-Session】Session的基本应用
在服务端存储状态的对象:Session和Application 在客户端存储状态的对象:Cookie 1.Session:每个独立的浏览器都会创建一个独立的Session,不是一台电脑一个Sessio ...
- Shell之操作环境
目录 Shell之操作环境 参考 命令运行顺序 欢迎信息 环境配置 Shell之操作环境
- Spring 中使用 @Scheduled 创建定时任务
一.定时任务触发条件 1.在 Application 启动类上添加:@EnableScheduling 2.含定时方法的类上添加注解:@Component,该注解将定时任务类纳入 spring bea ...
- Centos6 日常使用小结
网络配置目录 1./etc/sysconfig/network-script/ifcfg-eth0 2.netstat -rn Kernel IP routing table Destination ...
- ELK 学习笔记之 Kibana入门使用
Kibana入门使用: 第一次导入索引: 修改展示时间,不然查不到数据: 点Discover,查阅数据: 如果要添加新的index: 点击Visualize, 创建chart: 点击Dashboard ...
- Drill 学习笔记之 与Mongo性能测试比较
性能测试: 竟然用了30秒.... 如果使用mongo 客户端只有1-2秒 感觉Drill是把数据拉过来再进行sql优化,并没有使用Mongo的API,效率低下让人失望...
- CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?
CSS 选择符有哪些? 1.id选择器(#id) 2.类选择器(.class) 3.标签选择器(div,h1,p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器 ...
- A-04 坐标轴下降法
目录 坐标轴下降法 一.坐标轴下降法流程 二.坐标轴下降法和梯度下降法的异同 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:http ...
- html、css以及javascript的注释方式
HTML:<!--注释内容 -->; CSS:/* 注释内容*/ JS: //注 释内容; 或者块/* 注释内容 */, sublime中注释方法:选中注释内容+ctrl+/ , ...
- requests模块(post)请求篇
'''利用parse模块模拟post请求分析百度词典分析步骤:1. 打开F122. 尝试输入单词girl,发现每敲一个字母后都有请求3. 请求地址是 http://fanyi.baidu.com/su ...