- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
編写高质量代码改善C程序的157个建议
前言
本文主要来学习记录前三个建议。
建议1、正确操作字符串
建议2、使用默认转型方法
建议3、区别对待强制转换与as和is
其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正。
建议1、正确操作字符串
字符串应该是所有编程语言中使用最频繁的一种基础数据类型。如果使用不慎,我们就会为一次字符串的操作所带来的额外性能开销而付出代价。本条建议将从两个方面来探讨如何规避这类性能开销:
1、确保尽量少的装箱
2、避免分配额外的内存空间
先来介绍第一个方面,请看下面的两行代码:
String str1=str1+9;
String str2=str2+9.ToString();
从IL代码可以得知,第一行代码在运行时完成一次装箱的行为,而第二行代码中并没有发生装箱的行为,它实际调用的是整型的ToString()方法,效率要比装箱高。所以,在使用其他值引用类型到字符串的转换并完成拼接时,应当避免使用操作符“+”来完成,而应该使用值引用类型提供的ToString()方法。
第二方面,避免分配额外的内存空间。对CLR来说,string对象(字符串对象)是个很特殊的对象,它一旦被赋值就不可改变。在运行时调用System.String类中的任何方法或进行任何运算(如“=”赋值、“+”拼接等),都会在内存中创建一个新的字符串对象,这也意味着要为该新对象分配新的内存空间。像下面的代码就会带来运行时的额外开销。
private static void NewMethod1()
{
string s1=abc;
s1=123+s1+456; ////以上两行代码创建了3个字符串对象对象,并执行了一次string.Contact方法
}
private static void NewMethod2()
{
string re=9+456; ////该方法发生了一次装箱,并调用一次string.Contact方法
}
关于装箱拆箱的问题大家可以查看我之前的文章
而以下代码,字符串不会在运行时进行拼接,而是会在编译时直接生成一个字符串。
private static void NewMethod3()
{
string re2=123+abc+456; ///该代码等效于///string re2=123abc456;
}
private static void NewMethod4()
{
const string a=t;
string re=abc+a; ///因为a是一个常量,所以该代码等效于string=re=abc+t; 最终等效于string re=abct;
}
由于使用System.String类会在某些场合带来明显的性能损耗,所以微软另外提供了一个类型StringBuilder来弥补String的不足。
StringBuilder并不会重新创建一个string对象,它的效率源于预先以非托管的方式分配内存。如果StringBuilder没有先定义长度,则默认分配的长度为16。当StringBuilder字符串长度小于等于16时,StringBuilder不会重新分配内存;当StringBuilder字符长度大于16小于32时,StringBuilder又会重新分配内存,使之成为16的倍数。在上面的代码中,如果预先判断字符串的长度将大于16,则可以为其设定一个更加合适的长度(如32)。StringBuilder重新分配内存时是按照上次容量加倍进行分配的。当然,我们需要注意,StringBuilder指定的长度要合适,太小了,需要频繁分配内存,太大了,浪费空间。
查看以下代码,比较下面两种字符串拼接方式,哪种效率更高:
private static void NewMethod1()
{
string a = t;
a += e;
a += s;
a += t;
}
private static void NewMethod2()
{
string a = t;
string b = e;
string c = s;
string d = t;
string result = a + b + c + d;
}
结果可以得知:两
您可能关注的文档
- 線性代数在桥梁分析中的应用.doc
- 線性代数环境科学中的应用.doc
- 線性代数复习与研究.doc
- 線性代数的学习和在实际中的应用.doc
- 線性代数的应用案例.doc
- 線性卷积与圆周卷积的计算.docx
- 線性代数的应用论文.doc
- 線性卷积和圆周卷积的关系.doc
- 線性回归在实际问题中的应用.doc
- 線性卷积与循环卷积的比较.doc
- 汕尾市2025-2026学年度普通高中毕业班综合测试(一) 语文试卷(含答案).pdf
- 2025年湖南湘江新区招聘勤务协助人员笔试备考题库带答案详解(完整版).docx
- 汕尾市2025-2026学年度普通高中毕业班综合测试(一) 语文试卷(含答案).docx
- 基础护理知识普及.pptx
- 2025年湖南湘江新区招聘勤务协助人员笔试备考题库带答案详解.docx
- 传媒互联网行业AI应用商业化系列:MiniMax,国产全模态多面手,模型与应用飞轮启动.pdf
- 健身中心会员管理与服务协议范文.docx
- 设备验证流程与报告编写规范指南.docx
- 2025年湖南湘江新区招聘勤务协助人员笔试备考题库完整参考答案详解.docx
- 面对常见自然灾害如何应对主题班会PPT课件.pptx
最近下载
- 新解读《GB_T 39967 - 2021五轴联动加工中心S形试件精度检验》最新解读.pptx VIP
- 全球生物医药产业创新驱动发展白皮书.docx VIP
- 国家开放大学(电大)《人文英语2》2025年期末考试真题含答案.docx VIP
- 生物医药产业创新驱动发展.pptx VIP
- 2026年中考数学压轴题专项练习-倍长中线(学生版+详解版).pdf VIP
- 2026年中考数学压轴题专项练习-倍长中线(学生版).pdf VIP
- 中国生物医药产业分析与趋势.pptx VIP
- 生物医药产业创新趋势分析.pptx VIP
- 生物医药产业趋势分析.pptx VIP
- 船用UG-25+调速器安装调试手册.pdf
原创力文档


文档评论(0)