CLR via C# - Char_String
.NET中Char表示为16为的Unicode值,Char提供两个public const字段MinValue('\0',写成'\u0000'也是一样的)和MaxValue('\uffff').
Char.GetUnicodeCategory(char实例)来返回char所属的unicode类型,返回System.Globalization.UnicodeCategory枚举之一
'\0'的category为Control,所有类别如下
- Console.WriteLine("All Categories:");
- Enum.GetNames(typeof(System.Globalization.UnicodeCategory)).ToList().ForEach(Console.WriteLine);
- /*
- All Categories:
- UppercaseLetter
- LowercaseLetter
- TitlecaseLetter
- ModifierLetter
- OtherLetter
- NonSpacingMark
- SpacingCombiningMark
- EnclosingMark
- DecimalDigitNumber
- LetterNumber
- OtherNumber
- SpaceSeparator
- LineSeparator
- ParagraphSeparator
- Control
- Format
- Surrogate
- PrivateUse
- ConnectorPunctuation
- DashPunctuation
- OpenPunctuation
- ClosePunctuation
- InitialQuotePunctuation
- FinalQuotePunctuation
- OtherPunctuation
- MathSymbol
- CurrencySymbol
- ModifierSymbol
- OtherSymbol
- OtherNotAssigned
- */
当然那个枚举里面木有中文啊,像下面汉字直接显示为Other Letter
char提供一系列静态方法,IsControl IsLetter IsNumber等等,内部都是调用GetUnicodeCategory来的,由于我们不能修改.NET程序集,我们可以给char结构加上扩展方法IsChineseCharacter。目前常见的中文匹配范围为4E00-9FA5,可以为Char写个扩展方法来判断
- /// <summary>
- /// 是否是中文字符
- /// </summary>
- /// <param name="this"></param>
- /// <returns></returns>
- public static bool IsChineseCharacter(this char @this)
- {
- var low = '\u4E00';
- var high = '\u9FA5';
- return @this.Between(low,high);
- }
- //betwen如下
- /// <summary>
- /// 当前值,介于两参数之间
- /// </summary>
- /// <typeparam name="T">值类型</typeparam>
- /// <param name="current">当前值</param>
- /// <param name="low">低档值</param>
- /// <param name="high">高档值</param>
- /// <returns>介于两者之间</returns>
- public static bool Between<T>(this T current,T low,T high)
- where T : IComparable<T>
- {
- //compare方法,
- //小于 <0
- //等于 =0
- //大于 >0
- return current.CompareTo(low) * current.CompareTo(high) <= ;
- }
Char的大小写转换.Invariant是固定的,不变的,ToUpperInvariant以一种忽略文化的方式转换大小写,ToUpper ToLower会从System.Threading.Thread.CurrentThread.CurrentCulture获取文化地区相关的信息
转换
1.强制类型转换:编译器会生成IL指令来执行转换,效率最高,还可以指定checkd和unchecked,例如可以unchecked((char)(65535+65)),大写的A
2.System.Convert类,一堆静态方法,总是以checked方式来转换
3.IConvertible接口,效率最差,在值类型上调用接口方法要求装箱,强制转换成IConvertible接口来调用,IConvertible接口是显示实现的
字符串
1.构造
string s="Hello World!";
string snew=new String("Hello World!");//这种方法是不允许的
在IL指令中,newobj用于new Object,对于string有特殊的指令ldstr,编译时string会被嵌入到程序集元数据,从元数据中load
对于string s="strpart1 "+" "+"strpart2";这样的所有字符串都是[直接量],编译时会将他们连成一个字符串嵌入元数据.字符串是在托管堆上分配的
2.字符串 是不可变的(immutable),对于字符串的任何改变都不会影响原来的字符串(PS:曾经初学的时候遇到坑,各种查错...),返回新构建的字符串,这种会造成很多的string垃圾
字符串留用,内部hashtable,对于同一个string只存放一个,例如string s1="hello",s2="hello";s1=String.Intern(s1);s2=String.Intern(s2),这时候s1和s2的referenceEqual为true,也就是指向了同一对象...C#编译器都不用这个了,CLR via C#书上也就这么讲,如果编程工作因string太多影响程序效率可以再研究研究
3.字符串比较
又是方法 & 文化特性那些
方法equals compare startwith endwith等,里面有一个StringComparison comparisonType参数
StringComparison枚举:
CurrentCulture InvariantCulture Oridinal以及他们的IgnoreCase版本
Invariant:前面说过,不变的,固定的Culture,就是没有一种具体的语言文化
Oridinal:顺序的,依次的,书上叫 序号比较,执行字符串比较最快
Summary:InVariant在处理向用户展示的数据时不用,Equal默认用的是Oridinal,CompareTo默认依赖Culture,非Oridinal会将字符串展开(在其他语言里面的某些字母是几个字母合起来的,只能不明觉厉)来比较.
CultureInfo
CurrentCulture:控制货币,日期等等
CurrentUICulture:控制UI界面的Culture
CultureInfo引用了一个SystemGlobalization.CompareInfo,包含Compare方法
查看String.CompareTo源码可以看见,调用的是CompareInfo.Compare
4.StringBuilder
两种情况下会在托管堆中分配新的对象
1.构建的字符串超了StringBuilder的Capcity
2.调用了ToString之后继续修改
CLR via C# - Char_String的更多相关文章
- CLR via C# - Char_String - Format
//前面那个本来想重新编辑的,但是那个编辑器之前被我调到Markdown之后,改回Tiny MCE编辑器不出来 1.ToString()方法 & IFormattable & IFor ...
- CLR 这些年有啥变化吗?
引言 首先想给初学者推荐下<CLR via C#>这本好书,做.Net开发的开发者应该都读一下.为避免广告之嫌,所以这里只提供豆瓣书评的链接. CLR 作为.Net 程序跨平台运行的载体, ...
- clr 元数据
clr相关编译器编译生成的托管模块由四部分组成:PE32或32+头.clr头.元数据.IL代码. 元数据和IL代码完全对应,保持一致(:>)性. 元数据有很多用途: VS的智能感知,自动补全: ...
- 不得不知的CLR中的GC
引言 GC 作为CLR的垃圾回收器,让程序员可以把更多的关注度放在业务上而不是垃圾回收(内存回收)上.其实很多语言也有类似的东东, 如Java也有JIT 等等 GC基本概念 垃圾回收机制的算法有好多种 ...
- .Net 面试题 3C(CTS,CLS,CLR)
1.CTS(Common Type System)通用类型系统 CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展.任何以.NET平台作为目标的语言必须建立它的数 ...
- MSSQLSERVER添加c# clr程序集的使用方法
前言 MSSQLSERVER提供程序集,无疑可以让编程人员更加便捷的操作数据库数据,比如c#写的函数,可以在数据库当作sql的函数使用,你想想他对不熟悉数据库的程序员来说是有多么的嗨.这么好的机制,大 ...
- 类型基础---CLR Via C#笔记一
一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...
- CLR via C# 摘要二:IL速记
最简单的IL程序 .assembly test {} .method void Func() { .entrypoint ldstr "hello world" call void ...
- CLR via C# 摘要一:托管程序的执行模型
托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...
随机推荐
- HTML与CSS入门——第十章 创建用于Web上的图像
知识点: 1.选择图像软件的方法 2.准备用于网上的照片的方法 3.创建标题和按钮的方法 4.减少图像中颜色数量的方法 5.创建透明图像的方法 6.创建平铺背景的方法 7.创建Web动画的方法 10. ...
- IP地址基础和子网规划之其一
IP地址的介绍:在TCP/IP环境中,各种各样的终端.工作站能同服务器.其他工作站无缝连接,是因为每一网络节点都使用了全网范围内能够唯一标识节点的IP地址.每个网络有一个全网唯一的网络号,在该网络中各 ...
- 《APUE》读书笔记第十一章-线程
本章主要介绍了线程,了解如何使用多线程在单进程环境中来执行多任务.由于多个线程共享其进程空间,所以必须采用同步的机制来保护数据的一致性. 一.线程的概念 典型的Unix系统都可以看成只有一个控制线程, ...
- eclipse 添加jar包的方式
参考资料地址:http://blog.csdn.net/mazhaojuan/article/details/21403717
- sql 字段先计算后再拿比对的字段进行比对 效率提升100倍
关于日期索引的使用,不要计算后再对比,否则使用不了索引例如:以下执行不了索引,耗时很大 dywl=# explain analyze SELECT car_bill.billno,car_bill.b ...
- 文件:因为懂你,所以永恒 - 零基础入门学习Python028
文件:因为懂你,所以永恒 让编程改变世界 Change the world by program 因为懂你,所以永恒 大多数的程序都遵循着:输入->处理->输出的模型,首先接受输入数据,然 ...
- 【转】Android出现“Read-only file system”解决办法
原文网址:http://www.111cn.net/sj/android/44496.htm 下面介绍一篇Android出现“Read-only file system”解决办法 有碰到这类问题的朋友 ...
- Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入
原理:http://blog.csdn.net/cpytiger/article/details/8781457 原文地址:http://www.cnblogs.com/wintersun/archi ...
- poj3299
...
- OpenStackCLI调试及术语识记
1,Project are organizational units in the cloud,and are also known as tenants or accounts.Each user ...