14.1 字符

三种数值类型与 Char 实例的相互转换:

        static void Main()
{
Char c;
Int32 n; //方法一: 通过C#转型(强制类型转换)实现数字与字符的相互转换
//效率最高
c = (char)65;
Console.WriteLine(c); //显示"A" n = (int)c;
Console.WriteLine(n); //显示"65" c = unchecked((char)(65536 + 65));
Console.WriteLine(c); //显示"A" //方法二: 使用Convert实现数字与字符的相互转换
c = Convert.ToChar(65);
Console.WriteLine(c); //显示"A" n = Convert.ToInt32(c);
Console.WriteLine(n); //显示"65" //演示Convert的范围检查
try
{
c = Convert.ToChar(70000); //对16位来说过大
Console.WriteLine(c); //不执行
}
catch (OverflowException)
{
Console.WriteLine("Can't convert 70000 to a Char.");
} //方法三: 使用IConvertible实现数字与字符的相互转换
//效率最差.因为在值类型上调用接口方法要求对实例进行装箱--Char 和所有数值类型都是值类型.
c = ((IConvertible)65).ToChar(null);
Console.WriteLine(c); //显示"A" n = ((IConvertible)c).ToInt32(null);
Console.WriteLine(n); //显示"65"
}

14.2 System.String类型

14.2.1 构造字符串

14.2.2 字符串是不可变的

14.2.3 比较字符串

  • 出于编程的目的而比较字符串时,应该总是使用 StringComparison.Ordinal 或者 StringComparison.OrdinalIgnoreCase . 忽略语言文化是字符串比较最快的方式.
  • 如果要以语言文化正确的方式来比较字符串(通常为了向用户显示),就应该使用 StringComparison.CurrentCulture 或者 CurrentCultureIgnoreCase .
  • 要在序号比较(传递 StringComparison.Ordinal 执行的就是序号比较,不考虑语言文化信息,只比较字符串中的每个Char的Unicode码位)前更改字符串中字符的大小写,应该使用 String 的 ToUpperInvariantToLowerInvariant 方法(String类没有提供ToUpperOrdinal和ToLowerOrdinal方法).强烈建议用ToUpperInvariant方法对字符串进行正规化,因为Microsoft对执行大写比较的代码进行了优化.ToUpper和ToLower方法对语言文化敏感,速度较慢.
  • 避免使用不带 StringComparison 参数的其它重载方法,以及避免使用==和!=操作符,因为这样无法从方法名看出默认比较方式,不利于代码的阅读和维护.

14.2.4 字符串留用

        public static string Intern(string str);
public static string IsInterned(string str);
  • Intern 获取一个String,如果内部哈希表中存在,则返回该字符串的引用;如果不存在,就创建字符串的副本,并添加到内部哈希表中,返回对该副本的引用.
  • IsInterned 和 Intern 类似,只是当内部哈希表中不存在时,不会创建,而是返回 null
  • 了解就好,经测试,c#默认都是留用的.

14.2.5 字符串池

14.2.6 检查字符串中的字符和文本元素

14.2.7 其他字符串操作

14.3 高效率构造字符串

14.3.1 构造 StringBuilder 对象

  • StringBuilder 维护的字符数组长度默认为16,追加字符时,超出会倍增
  • 数组动态扩容会损害性能,最好给一个合适的初始值. (这个类似于List的实现)

14.3.2 StringBuilder 的成员

14.4 获取对象的字符串表示:ToString

14.4.1 指定具体的格式和语言文化

  • "C" 表示货币格式
  • "D" 表示十进制格式
  • "E" 表示科学记数法(指数)格式
  • "G" 表示常规格式
  • "N" 表示数字格式
  • "P" 表示百分比格式
  • "X" 表示十六进制格式
            var n = 123456;
Console.WriteLine(n.ToString("C"));
Console.WriteLine(n.ToString("D"));
Console.WriteLine(n.ToString("E"));
Console.WriteLine(n.ToString("G"));
Console.WriteLine(n.ToString("N"));
Console.WriteLine(n.ToString("P"));
Console.WriteLine(n.ToString("X"));
// 以下为输出
// ¥123,456.00
// 123456
// 1.234560E+005
// 123456
// 123,456.00
// 12,345,600.00%
// 1E240
  • 使用特定语言文化格式化:
            decimal price = 123.54M;
string s = price.ToString("C", new CultureInfo("en-US"));
Console.WriteLine(s); //输出: $123.54

14.4.2 将多个对象格式化成一个字符串

            string s = string.Format("订单 {0} 的商品数量为 {1:N0} 个,金额为 {2:C}",
"11", 1234, 10000);
Console.WriteLine(s);
//中文环境下输出: 订单 11 的商品数量为 1,234 个,金额为 ¥10,000.00

14.4.3 提供定制格式化器

14.5 解析字符串来获取对象: Parse

  • 如果频繁调用 Parse, 而且 Parse 频繁抛出异常,应用程序的性能会显著下降. 可考虑 TryParse

14.6 编码: 字符和字节的相互转换

            //准备编码的字符串
string s = "Hi there."; //获取从Encoding派生的一个对象.
//它知道怎样使用UTF8来进行编码/解码
Encoding encodingUTF8 = Encoding.UTF8; //将字符串编码成字节数组
Byte[] encodedBytes = encodingUTF8.GetBytes(s); //显示编好码的字节值
Console.WriteLine("Encoded bytes: " +
BitConverter.ToString(encodedBytes)); //将字节数组解码回字符串
String decodedString = encodingUTF8.GetString(encodedBytes); //显示解码的字符串
Console.WriteLine("Decoded String: " + decodedString); //上述代码输出如下:
// Encoded bytes: 48-69-20-74-68-65-72-65-2E
// Decoded String: Hi there.
  • **避免使用 Encoding.Default **,不同服务器有可能不同. (可在"控制面板" --> "区域和语言" --> "非 Unicode 程序中所使用的当前语言" 中设置)

14.6.1 字符和字节流的编码和解码

14.6.2 Base-64字符串编码和解码

            //获取一组10个随机生成的字节
byte[] bytes = new byte[10];
new Random().NextBytes(bytes); //显示字节
Console.WriteLine(BitConverter.ToString(bytes)); //将字节解码成 Base-64 字节串,并显示字符串
string s = Convert.ToBase64String(bytes);
Console.WriteLine(s); //将Base-64字符串编码回字节,并显示字节
bytes = Convert.FromBase64String(s);
Console.WriteLine(BitConverter.ToString(bytes)); //范例输出,因为是随机数,所以结果会不同
// 35-17-02-B7-F2-AF-EC-2A-E7-5D
// NRcCt/Kv7CrnXQ==
// 35-17-02-B7-F2-AF-EC-2A-E7-5D

14.7 安全字符串

返回目录

<NET CLR via c# 第4版>笔记 第14章 字符,字符串和文本处理的更多相关文章

  1. <NET CLR via c# 第4版>笔记 第19章 可空值类型

    System.Nullable<T> 是结构. 19.1 C# 对可空值类型的支持 C# 允许用问号表示法来声明可空值类型,如: Int32? x = 5; Int32? y = null ...

  2. <NET CLR via c# 第4版>笔记 第18章 定制特性

    18.1 使用定制特性 FCL 中的几个常用定制特性. DllImport 特性应用于方法,告诉 CLR 该方法的实现位于指定 DLL 的非托管代码中. Serializable 特性应用于类型,告诉 ...

  3. <NET CLR via c# 第4版>笔记 第17章 委托

    17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类 ...

  4. <NET CLR via c# 第4版>笔记 第16章 数组

    //创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 doubl ...

  5. <NET CLR via c# 第4版>笔记 第13章 接口

    13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. ...

  6. <NET CLR via c# 第4版>笔记 第12章 泛型

    泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一 ...

  7. <NET CLR via c# 第4版>笔记 第5章 基元类型、引用类型和值类型

    5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句 ...

  8. <NET CLR via c# 第4版>笔记 第6章 类型和成员基础

    6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有inte ...

  9. <NET CLR via c# 第4版>笔记 第7章 常量和字段

    7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量 ...

随机推荐

  1. dp入门 专题记录 2017-7-26

    POJ3176-Cow Bowling 题目大意:现有n行数,以金字塔的形式排列,即第一行一个数字,第二行2个数字,依次类推,现在需要找一条从第一层到第n层的路线,使得该路线上的所有点的权值和最大 思 ...

  2. Python matplot的使用(一)

    其实,使用它的直接原因是因为matlab太大了,不方便.另外,就是它是免费的. 在安装这个库的时候,会需要安装一些它所依赖的库,比如six等.从sourceforge上下载,只需按照提示安装完成就行了 ...

  3. Selenium 定位页面元素 以及总结页面常见的元素 以及总结用户常见的操作

    1. Selenium常见的定位页面元素 2.页面常见的元素 3. 用户常见的操作 1. Selenium常见的定位页面元素 driver.findElement(By.id());driver.fi ...

  4. MongoDB(课时7 逻辑运算)

    3.4.2.2 逻辑运算 逻辑运算主要三种类型:与($and),或($or),非($not.$nor). 范例:查询年龄在20~21岁的学生信息 db.students.find({"age ...

  5. 关于C#中的日期的一个简单总结

    首先,总结两个简单的方法,实现 秒 与 日期 的相互转换: public class MyTest { /// <summary> /// 将Unix时间戳转换为DateTime类型时间, ...

  6. 顶点与UV

    1.顶点坐标和UV坐标是三维模型重要的两个坐标系统. 2.什么是UV?UV分别是图像在显示器水平和垂直方向上坐标,值在 0 - 1 之间 ,即水平方向的第 U 个做像素/图片宽度,垂直方向的第 V 个 ...

  7. 雷林鹏分享:C# 多态性

    C# 多态性 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态 ...

  8. 20170714xlVba多个工作簿转多个Word文档表格

    Public Sub SameFolderGather() Application.ScreenUpdating = False Application.DisplayAlerts = False A ...

  9. 12月12日 has_many through:的interference, option

    has_many :products, through: :cart_items, source: :product build定义:collection.build(attributes = {}, ...

  10. 【模板/经典题型】带有直线限制的NE Latice Path计数

    平移一下,变成不能接触y=x+1. 注意下面的操作(重点) 做点p=(n,m)关于这条直线的对称点q=(m-1,n+1). ans=f(p)-f(q). 其中f(x)为从(0,0)到点x的方案数.