NET运用String的十八层境界
古往今来,文本处理一直是所有编程语言的最基础的功能,也是最核心最重要的功能。任何初学者,如果想学一门编程语言,都要面对大量的文本处理。而或许有一天,即使你成了大师级的人物,也不敢说自己驾驭文本处理的能力,就已登峰造极。对String理解和运用,应该可以很好地代表开发者的专业水平。
写Request.QueryString["id"].ToString()的显然属于比较初级的层次,那么专业一点的层次有什么表现呢?在本文,就试图归纳划分一下这水平的层次或境界,并抓些现行给大家参考。
一、入门级
第一层
初涉江湖。String就是这样:string s =”abc”,带俩双引号这就是个String。有天分很快发现string还可以相加。
但是,一说到说什么引用类型?值类型?唉,我好模糊啊……
第二层
不变应万变。label1.Text = n,报错说类型不兼容?原来还要ToString()一下。于是吐丝准成了此类.Net程序员的必杀技,Request.QueryString[id].ToString()就是最常见的例子。
第三层
如鱼得水。学会用Convert.ToInt32之类方法转换字符串,转过去,转回来。
来挖挖坟,看看早期的.Net程序员就已十分专业: 如何把string解析为int? 好在初学C#时我没看到此文。
第四层
世界真奇妙。光个String类型就有这么多方法,这怎么记不住啊,每个都够研究个几天,比如 关于string.Join()的妙用与疑惑 、String.Substring()使用注意, 还有分析Trim、IndexOf、Split等等不逐一列举了,过去都是园子首页的常客。
(题外话:一下子都研究明白了生活就没意思了,经常惊叹下“原来还有这个”不是挺好的)
二、菜鸟级
第五层
听说了字符串不要+拼接,要用StringBuilder,不然效率太低。
这篇还不错,不过题目有点浮:彻底研究StringBuilder。StringBuilder要彻底研究还真不简单,不过除了极懒的一小撮外,基本算是普及了。
第六层
会用静态方法啦:比如String.IsNullOrEmpty,但是对String.Format方法,还是要纠结好久吧。要是你会String.Concat,会区别它与StringBuilder用的场合,恭喜你,你的水平离.Net社区牛人—老赵也就差一年多了( 重谈字符串连接性能 )。
第七层
ToString的格式输出,名堂真多:C代表钱,D代表整数,E是指数,F是小数,y是年,大写M是月,小写m是分钟…… 这哪记得住?
其实,能记住前几种就不错了,知道用时去查就好(C# 格式化字符串)。尤其,要分清大MM和小mm的区别。只需三分钟,飞越第七层。
第八层
开始从多个场景,如文件中,取得字符串。了解很多该用String表示的东西,很多不是String的东西,心有灵犀一点通,告别了盲目的类型转换。
此层说深不深,可以一跳而过;说浅不浅。我们公司有个WebService项目超级规范,全部方法参数、全部返回的实体属性清一色的string类型。对读取文件,至今许多有多年开发经验同行的仍然云里雾里,应该也包括偶。一个博问中问题:请教200M大的TXT文件如何快速读取,有谁能迅速给出标准实现的?
三、上手级
第九层:
学会了翻转字符串,真的!恭喜,根据砖家定义,你已超越北大菜鸟级别了(为什么我要反对北大青鸟)。
第十层:
会用foreach遍历String中的字符,明白了编码方式决定字符串中的字符,是一个字节,还是两个或更多。
编码是个大学问,偶一看就晕,就这么凑合着过了吧。您力所能及的话,还是建议深入了解下:字符集和字符编码(Charset & Encoding)
第十一层:
开始从流中读取字符串,偶尔还会重写下ToString方法 (文件流转换为string )。
流是现代编程语言的最重要的基本对象模型,和String地位相当。接触了这两者之间的联系,对一门语言的认识开始立体起来。
第十二层:
处理的字符串工作日渐繁重,直到一天发现了正则表达式,腰不酸了,腿不疼了。
我看的是这种正则表达式30分钟入门教程,结果花了无数个30分钟,还是没入门。不过还是值的,确实有时候比写代码处理容易得多,甚至是救命稻草,此时更高端的我们都不会。
四、达人级
第十三层:
一日突然被问到:string a = “a”+ “b”分配了几次内存?
蒙了,String是什么,Immutable、引用类型、拘留池、程序域,概念大爆发开始了。
年前的面试经历(二) ,献丑一下,精彩的是评论。
第十四层:
见到不是一个字符串,而是对一组编码字节的引用,是所谓见山不是山。
[你必须知道的.NET]第二十二回 中的一段话 “string真是一个丰富而多彩的技术仓库,饱含了.NET技术中很多精髓与技巧"。
第十五层:
诸如BinaryReader(Writer)/StringReader(Writer),都已不在话下。
看老赵的随笔:浅谈字节序(Byte Order)及其相关操作。
第十六层:
开始在String类源代码中寻找疑问的答案。
.Net Discovery 系列之一--string从入门到精通
五、大师级
第十七层:
无招胜有招,这种境界,打自动机,写编译器,跟玩似的。
园中的脑袋,大概接近了此境界:自己动手开发编译器(一)编译器的模块化工程 。
第十八层:
见山还是山。重写个String类型都毫无压力了吧,其实什么类型方法都成了浮云。传说中的境界……
NET运用String的十八层境界的更多相关文章
- EM算法理解的九层境界
EM算法理解的九层境界 EM 就是 E + M EM 是一种局部下限构造 K-Means是一种Hard EM算法 从EM 到 广义EM 广义EM的一个特例是VBEM 广义EM的另一个特例是WS算法 广 ...
- Python之路【第十八篇】:Web框架们
Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Pytho ...
- Spring Boot 2.X(十八):集成 Spring Security-登录认证和权限控制
前言 在企业项目开发中,对系统的安全和权限控制往往是必需的,常见的安全框架有 Spring Security.Apache Shiro 等.本文主要简单介绍一下 Spring Security,再通过 ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- 王颖奇 201771010129《面向对象程序设计Java》第十八周实验总结
实验十八 总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设 ...
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之十二(四十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存
很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录:一.通过Dapr实现 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
- Unity3D研究院之Jenkins的使用(七十八)
长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...
随机推荐
- (C/C++学习)18.C语言双向链表
说明:数组提供了连续内存空间的访问和使用,而链表是对内存零碎空间的有效组织和使用.链表又分为单向链表和双向链表,单向链表仅提供了链表的单方向访问,相比之下,双向链表则显得十分方便. 一.单向链表的节点 ...
- Python学习-while循环语句
Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.即重复性的做一件事情 语法形式如下: while 判断条件: 条件满足执行语句…… ...
- 爬虫----Web_WeChat
流程: 打开的web_wechat,就有出现二维码,在network中,name中login?loginicon中,status的状态是pending,pending的意思是前端发送了一个请求,但是还 ...
- radial profiles of mean streamwise velocity at X/D=3
matlab code: load aver_ux_array.dat; load z_array.dat; r=z_array(:,); r=r.' r_j=0.00125; r_nor=r/d; ...
- 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
[题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...
- AOP基础
[Why AOP ?] 1.代码混乱:越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀.每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点. 2.代码分散:以日志需求为例,知识为了 ...
- Windows学习总结(8)——DOS窗口查看历史执行过的命令的三种方式
在DOS窗口执行了一些列命令完成某项工作后,如果要查看都执行了那些命令,该如何办呢?(前提:DOS窗口未关闭的情况下) 一.方法一: 使用↑↓箭头上下翻看执行过的命令,此方式适宜执行命令较少的情况. ...
- HDU 1325 拓扑排序
根据题目所给的3个不符合情况的条件,一个个判断图是否符合这3个条件即可 1.不能出现内部环,拓扑排序判断 2.不能有超过1个点的入度为0,因为只有一个树根 3.每个点最多一个入度 这里要注意的一点是这 ...
- Promise 异步编程
//1.解决异步回调问题 //1.1 如何同步异步请求 //如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务,无法实现并行节约时间 const fs = requ ...
- DELPHI新版本WEBSERVICE的变化
DELPHI新版本WEBSERVICE,不仅可以编译成ISAPI DLL,依靠IIS部署, 并且还可以编译成单独的EXE,不再依赖IIS就可以独立运行,这一点未尝不可以说是非常方便的改进.