首页 > 学院 > 开发设计 > 正文

CLR via C#

2019-11-17 03:18:59
字体:
来源:转载
供稿:网友

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,所有类别如下

 1 Console.WriteLine("All Categories:"); 2             Enum.GetNames(typeof(System.Globalization.UnicodeCategory)).ToList().ForEach(Console.WriteLine); 3             /* 4             All Categories: 5                 UppercaseLetter 6                 LowercaseLetter 7                 TitlecaseLetter 8                 ModifierLetter 9                 OtherLetter10                 NonSpacingMark11                 SpacingCombiningMark12                 EnclosingMark13                 DecimalDigitNumber14                 LetterNumber15                 OtherNumber16                 SpaceSeparator17                 LineSeparator18                 ParagraphSeparator19                 Control20                 Format21                 Surrogate22                 PRivateUse23                 ConnectorPunctuation24                 DashPunctuation25                 OpenPunctuation26                 ClosePunctuation27                 InitialQuotePunctuation28                 FinalQuotePunctuation29                 OtherPunctuation30                 MathSymbol31                 CurrencySymbol32                 ModifierSymbol33                 OtherSymbol34                 OtherNotAssigned35              */
View Code

当然那个枚举里面木有中文啊,像下面汉字直接显示为Other Letter

char提供一系列静态方法,IsControl IsLetter IsNumber等等,内部都是调用GetUnicodeCategory来的,由于我们不能修改.NET程序集,我们可以给char结构加上扩展方法IsChineseCharacter。目前常见的中文匹配范围为4E00-9FA5,可以为Char写个扩展方法来判断

 1 /// <summary> 2         /// 是否是中文字符 3         /// </summary> 4         /// <param name="this"></param> 5         /// <returns></returns> 6         public static bool IsChineseCharacter(this char @this) 7         { 8             var low = '/u4E00'; 9             var high = '/u9FA5';10             return @this.Between(low,high);11         }12 13         //betwen如下14         /// <summary>15     /// 当前值,介于两参数之间16     /// </summary>17     /// <typeparam name="T">值类型</typeparam>18     /// <param name="current">当前值</param>19     /// <param name="low">低档值</param>20     /// <param name="high">高档值</param>21     /// <returns>介于两者之间</returns>22     public static bool Between<T>(this T current,T low,T high)23         where T : IComparable<T>24     {25         //compare方法,26         //小于 <027         //等于 =028         //大于 >029         return current.CompareTo(low) * current.CompareTo(high) <= 0;30     }
View Code

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之后继续修改


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表