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是微软推出的 ...
随机推荐
- window.dialogArguments的使用
<HTML> <HEAD> <TITLE>showModelessDialogEX.htm</TITLE> <SCRIPT> var sUs ...
- java必备基础知识(一)
学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...
- hdu 1263 水果
Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样J ...
- 洛谷 P3397 地毯
P3397 地毯 题目背景 此题约为NOIP提高组Day2T1难度. 题目描述 在n*n的格子上有m个地毯. 给出这些地毯的信息,问每个点被多少个地毯覆盖. 输入输出格式 输入格式: 第一行,两个正整 ...
- C#代码设置窗体和Panel的位置大小
1.设置Panel位置大小 private void button2_Click(object sender, EventArgs e) { panel1.Visible = false; panel ...
- php,apache伪静态(1转)
1.检测Apache是否支持mod_rewrite通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler ...
- js 16进制字符串互转
/** * 16进制转换为字符串 * @param hex * @returns {*} */ function hexToString(hex) { var tmp = ''; if (hex.le ...
- WordPress nginx环境下开启多站点
在wp-config.php插入 define('WP_ALLOW_MULTISITE', true); 进入管理页面安装网络,子目录模式按提示再在wp-config.php插入 define('MU ...
- 在JasperReport中填充JavaBean(4)
使用Parameters参数对象传递字符串的示例,本节将演示打印List接口中Userinfo.java实体类的示例,打印的数据源不是来自于Parameters对象,而是JRBeanCollectio ...
- 论如何进CSDN博客排名前500
http://www.jtahstu.com/blog/post-71.html 目前该方法并不适用于博客园,显然写博客园的程序员智商要高些.