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                 OtherLetter
10                 NonSpacingMark
11                 SpacingCombiningMark
12                 EnclosingMark
13                 DecimalDigitNumber
14                 LetterNumber
15                 OtherNumber
16                 SpaceSeparator
17                 LineSeparator
18                 ParagraphSeparator
19                 Control
20                 Format
21                 Surrogate
22                 PrivateUse
23                 ConnectorPunctuation
24                 DashPunctuation
25                 OpenPunctuation
26                 ClosePunctuation
27                 InitialQuotePunctuation
28                 FinalQuotePunctuation
29                 OtherPunctuation
30                 MathSymbol
31                 CurrencySymbol
32                 ModifierSymbol
33                 OtherSymbol
34                 OtherNotAssigned
35              */
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         //小于 <0
27         //等于 =0
28         //大于 >0
29         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接口是显示实现的

CLR via C# - Char_String_第1张图片

 

 字符串

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

CLR via C# - Char_String_第2张图片

4.StringBuilder

两种情况下会在托管堆中分配新的对象

1.构建的字符串超了StringBuilder的Capcity

2.调用了ToString之后继续修改
 

 

你可能感兴趣的:(String)