[CLR via C#]14. 字符、字符串和文本处理
一、字符
在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发。
internal static class CharConvert {
public static void Go() {
Char c;
Int32 n;
// 使用C#转型技术实现,强制类型转换
c = (Char);
Console.WriteLine(c); // 显示 "A"
n = (Int32)c;
Console.WriteLine(n); // 显示 "65"
c = unchecked((Char)( + ));
Console.WriteLine(c); // 显示 "A"
// 使用Convert进行转换
c = Convert.ToChar();
Console.WriteLine(c); // 显示 "A"
n = Convert.ToInt32(c);
Console.WriteLine(n); // Displays "65"
// 显示Convert的范围检查
try {
c = Convert.ToChar(); // 对 16-bits 来说过大
Console.WriteLine(c); // 不知心
}
catch (OverflowException) {
Console.WriteLine("Can't convert 70000 to a Char.");
}
// 使用IConvertible进行转换
c = ((IConvertible)).ToChar(null);
Console.WriteLine(c); // 显示 "A"
n = ((IConvertible)c).ToInt32(null);
Console.WriteLine(n); // 显示 "65"
}
}
二、字符串
class Program
{
private static void Main(string[] args)
{
String s = "Hi"; Console.WriteLine(s);
}
}
编译上述代码,并检查它的IL,会看到一下内容:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack
.locals init (
[] string str)
L_0000: nop
L_0001: ldstr "Hi"
L_0006: stloc.
L_0007: ldloc.
L_0008: call void [mscorlib]System.Console::WriteLine(string)
L_000d: nop
L_000e: ret
}
//包含回车符和换行符的字符串
String s ="Hi\r\nthere"
但是,一般不建议这么做。因为在不同的平台解释是不同的,推荐使用System.Environment中定义的NewLine属性。NewLine属性是依赖于平台的,他会一句底层平台返回恰当的字符串。
bool Equals (string value, StringComparison comparisonType)
static bool Equals (string a, string b, StringComparison comparisonType) static int Compare (string strA, string strB, StringComparison comparisonType)
static int Compare (String strA, String strB, bool ignoreCase, CultureInfo culture)
static int Compare (string strA, string strB, CultureInfo culture, CompareOptions options)
static int Compare (string strA, int indexA, string strB, int indexB, int length, StringComparison comparisonType)
static int Compare (string strA, int indexA, string strB, int indexB, int length, CultureInfo culture, CompareOptions options)
static int Compare (String strA, int indexA, String strB, int indexB, int length, bool ignoreCase, CultureInfo culture)
进行排序时应该总是执行区分大小写的比较。原因是假如只是大小写不同的两个字符串被视为相等,那么每次对它们进行派时许,它们都可能按照不同的顺序排列,从而造成用户的迷惑。
public enum StringComparison {
//使用区域敏感排序规则和当前区域比较字符串。
CurrentCulture,
//使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。
CurrentCultureIgnoreCase,
//使用区域敏感排序规则和固定区域比较字符串。
InvariantCulture,
//使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。
InvariantCultureIgnoreCase,
//使用序号排序规则比较字符串。
Ordinal,
//使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。
OrdinalIgnoreCase
}
另外,前面有两个方法要求传递一个CompareOptions参数。这个参数要获取有CompareOptions枚举类型定义的一个值:
public enum CompareOptions {
None = ,
//指示字符串比较必须忽略大小写。
IgnoreCase = ,
//指示字符串比较必须忽略不占空间的组合字符,比如音调符号。
IgnoreNonSpace = ,
//指示字符串比较必须忽略符号,如空白字符、标点符号、货币符号、百分号、数学符号、“&”符等等
IgnoreSymbols = ,
//指示字符串比较必须忽略 Kana 类型
IgnoreKanaType = ,
//指示字符串比较必须忽略字符宽度
IgnoreWidth = ,
//指示字符串比较必须使用字符串排序算法。
StringSort = 0x20000000,
//指示必须使用字符串的连续 Unicode UTF-16 编码值进行字符串比较(使用代码单元进行代码单元比较),这样可以提高比较速度,但不能区分区域性
Ordinal = 0x40000000,
//字符串比较必须忽略大小写,然后执行序号比较。
OrdinalIgnoreCase = 0x10000000
}
接受一个CompareOptions实参的方法要求你必须显式传递一个语言文化。如果传递了Ordinal或OrdinalIgnoreCase 标志,这些Comoare方法会忽略指定的语言文化。
//检索系统对指定 System.String 的引用
public static string Intern(string str)
//检索对指定 System.String 的引用
public static string IsInterned(string str)
第一个方法Intern获取一个String,获得它的哈希码,并在内部哈希表中检查是否有匹配的。如果存在一个完全相同的字符串,就返回对这个字符串已经存在的String对象的一个引用。如果不存在,就创建字符串的副本,将副本添加到内部哈希表中,并返回对这个副本的一个引用。
public static void Go() {
String s1 = "Hello";
String s2 = "Hello";
Console.WriteLine(Object.ReferenceEquals(s1, s2));// 'False'
s1 = String.Intern(s1);
s2 = String.Intern(s2);
Console.WriteLine(Object.ReferenceEquals(s1, s2));// 'True'
}
[CLR via C#]14. 字符、字符串和文本处理的更多相关文章
- [Clr via C#读书笔记]Cp14字符字符串和文本处理
Cp14字符字符串和文本处理 字符 System.Char结构,2个字节的Unicode,提供了大量的静态方法:可以直接强制转换成数值: 字符串 使用最频繁的类型:不可变:引用类型,在堆上分配,但是使 ...
- <NET CLR via c# 第4版>笔记 第14章 字符,字符串和文本处理
14.1 字符 三种数值类型与 Char 实例的相互转换: static void Main() { Char c; Int32 n; //方法一: 通过C#转型(强制类型转换)实现数字与字符的相互转 ...
- clr from c# 字符 ,字符串 和 文本处理
1,字符----------在.net中,字符总是16位的Unicode代码值.每个字符都是一个System.Char结构(值类型)的一个实列. using System; public class ...
- 重温CLR(十) 字符、字符串和文本处理
本章将介绍.net中处理字符和字符串的机制 字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构 ...
- CLR via C#字符串和文本处理
一.字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构(一个值类型) 的一个实例.Sy ...
- 《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 && 检查一个字符串是文本还是二进制
过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: impor ...
- 13、如何拆分含有多种分隔符的字符串 14、如何判断字符串a是否以字符串b开头或结尾 15、如何调整字符串中文本的格式 16、如何将多个小字符串拼接成一个大的字符串
13.如何拆分含有多种分隔符的字符串 import re s = "23:41:2314\1234#sdf\23;" print(re.split(r'[#:\;]+',s)) ...
- Python3-Cookbook总结 - 第二章:字符串和文本
第二章:字符串和文本 几乎所有有用的程序都会涉及到某些文本处理,不管是解析数据还是产生输出. 这一章将重点关注文本的操作处理,比如提取字符串,搜索,替换以及解析等. 大部分的问题都能简单的调用字符串的 ...
- [转]python3字符串与文本处理
转自:python3字符串与文本处理 阅读目录 1.针对任意多的分隔符拆分字符串 2.在字符串的开头或结尾处做文本匹配 3.利用shell通配符做字符串匹配 4.文本模式的匹配和查找 5.查找和替换文 ...
随机推荐
- 用户管理 之 用户(User)和用户组(Group)配置文件详解
用户(User)和用户组(Group)的配置文件,是系统管理员最应该了解和掌握的系统基础文件之一,从另一方面来说,了解这些文件也是系统安全管理的重要组成部份:做为一个合格的系统管理员应该对用户和用户组 ...
- android中自定义view---实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色
android自定义view,实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色. 由于时间比较仓促,因此没有对代码进行过多的优化,功能远远不如androi ...
- Hadoop2.x源码-编译剖析
1.概述 最近,有小伙伴涉及到源码编译.然而,在编译期间也是遇到各种坑,在求助于搜索引擎,技术博客,也是难以解决自身所遇到的问题.笔者在被询问多次的情况下,今天打算为大家来写一篇文章来剖析下编译的细节 ...
- CentOS6下Haproxy的安装配置
Haproxy 是一个开源的负载均衡和反向代理软件,其提供了高可用的网络服务.其一般是应用于web服务,但同时也能为SMTP和终端服务等提供可靠的支持. 1.下载安装haproxy wget ftp: ...
- [原]cocos2d-lua 常用法汇总
1.CCEditBox local back = CCScale9Sprite:create("res/ui/images/im_02.png", CCRect(20, 20, 1 ...
- js最新手机号码、电话号码正则表达式
原文链接:http://caibaojian.com/regexp-example.html 正则表达式(regular expression)是一个描述字符模式的对象.使用javascript正则表 ...
- 在自己的框架中引用 PHPExcel
如果直接在框架中的controller中直接引用 xxxx/PHPExcel.php,由于框架中有autoload 与PHPExcel的autoload冲突(加载目录原因), 那么在不想做太多修改的情 ...
- 【Android学习】数据传递三种方式
1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...
- [C++] memset 和sizeof 的使用注意
因为使用C++写小题目时经常需要清除数组,这里记录下Memset函数的sizeof运算符的使用注意. memset的特点是:将给定地址后连续的内存(包括给定地址),逐个byte初始化为参数中指明的值. ...
- Android样式的开发:drawable汇总篇
Android有很多种drawable类型,除了前几篇详细讲解的shape.selector.layer-list,还有上一篇提到的color.bitmap.clip.scale.inset.tran ...