字符串
一、StringComparison
1,出于编程目的而比较字符串时,应该总数使用StringComparison.Ordinal或者StringComparison. OrdinalIgnoreCase。忽略语言文化是字符串比较最快的方式
2,要以语言文化正确的方式来比较字符串(通常为了向用户显示),就应该使用StringComparison. CurrentCulture或者StringComparison. CurrentCultureIgnoreCase
3,StringComparison. InvariantCulture和StringComparison. InvariantCultureIgnoreCase平时最好不要用
二、CultureInfo
在CLR中,每个线程都关联了两个特殊属性,每个属性都引用一个CultureInfo对象。两个属性的具体描述如下
1,CurrentUICulture属性:该属性获取向用户显示的资源。它在GUI或Web窗体应用程序中特别有用,因为他标志了在显示UI元素(比如标签和按钮)时应使用的语言。创建线程时,这个线程属性会被设置成一个默认的CultureInfo对象,该对象标识了正在运行时应用程序的Windows版本所用的语言。而这个语言使用Win32函数GetUserDefaultUILanguage来获取的。如果应用程序在Windows的MUI(多语言用户界面)版本上运行,可通过控制面板的“区域和语言”对话框来修改语言。在非MUI版本的Windows上,语言有安装的操作系统的本地化版本(或安装的语言包)决定,而且这个语言不可更改
2,CurrentCulture属性:不适合用CurrentUICulture属性场合就该用该属性,例如数字和日期格式化、字符串大小写转换以及字符串比较。格式化要同时用到CultureInfo对象的“语言”和“国家”部分。创建线程时,这个线程属性被设置为一个默认的CultureInfo对象,其之通过调用Win32函数GetUserDefaultLCUID来获取。可通过Windows控制面板的“区域或语言”对话框来修改这个值
三。字符串留用
程序集加载时,CLR默认留用程序集的元数据中描述的所有字面值字符串。4.5版本以上会进行留用
static void Main(string[] args) { var s = "Hello"; var ss = "Hello"; //Console.WriteLine(string.IsInterned(ss)); //如果该字符已经留用,则返回对这个留用字符串对象的引用;没有留用,则返回null //Console.WriteLine(string.Intern(ss)); //如果该字符串已经留用,则返回对这个留用字符串对象的引用;没有留用,则留用 //Console.ReadKey(); Console.WriteLine(Object.ReferenceEquals(s,ss));//Ture //显示留用 s = string.Intern(s); ss = string.Intern(ss); Console.WriteLine(Object.ReferenceEquals(s, ss));//Ture Console.ReadKey(); }
四、字符串池
编译源代码时,编译器必须处理每个字面值字符串,斌仔托管模块的元数据中嵌入。同一个字符串在源代码中多次出现,把它们都嵌入元数据会使生成的文件无畏地增大。为了解决这个问题,许多编译器(包括c#编译器)只在模块的元数据中只将字面值字符串写入一次
五、StringBuilder
StringBuilder代表可变字符串
StringBuilder只有以下两种情况才会分配新对象:
①动态构造字符串,其长度超过了设置的“容量”
②调用StringBuilder的ToString方法
六、IFormattable
format:这个特殊字符串告诉方法应该如何格式化对象
formatProvider:实现了system. IFormatProvider接口的一个类型的实例,该类型微ToString方法提供具体的语言文化信息
1,Datetime
d:短日期
D:长日期
g:常规
M:月/日
s:可排序
T:长时间
u:ISO 8601格式的协调世界时
U:长日期格式的协调世界时
Y:年/月
所有的枚举类型都支持用G表示常规,F表示标志,D表示十进制,X表示十六进制
2,数值类型
C:货币格式
D:十进制格式
E:科学计数法(指数)格式
F:定点格式
N:数字格式
P:百分比格式
R:往返行程格式
3,IFormatProvider