《CLR via C#》基本类型.字符、字符串和文本处理

14.字符、字符串和文本处理

14.1System.Char结构

1.每个字符都是System.Char结构(一个值类型)的实例,Char类型提供了静态方法(比如:IsDigit、IsLetter、ToLower等)和实例方法(比如:ToString等)。
2.char和数值之间的强转:

char numChar = 'A';
Console.Write((int)numChar);
int num = 66;
Console.WriteLine((char)num); // 输出:65B

14.2字符串String(不可变)

1.String直接派生自Object,所以是引用类型。
2.C#不允许使用new构造String对象,只能这样做:string s = "jump";
3.字符串中可以包含回车符和换行符:s = "jump\r\nchen";但建议像下面这样写(在任何平台都正常工作)。

s = "jump" + Environment.NewLine + "chen";
Console.WriteLine(s);
输出:
jump
chen

4.在堆上创建字符串对象:
s = "jump" + " " + "chen";C#编译器会在编译时连接它们,最终只会在堆上创建一个字符串对象,即"jump chen";但对非字面值字符串使用+,连接只能在运行时进行,这样会在堆上创建多个字符串对象。
5.String类型也提供了静态方法(比如:Format返回一个指定格式的字符串)和实例方法(比如:ToUpperInvariant返回大写的新字符串)。
5.字符串一经创建就是不可变的:

string s = "jump";
// Substring(0,2)返回从第一个字符开始的连续2个字符组成的新字符串
Console.WriteLine(s.ToUpperInvariant().Substring(0, 2)); // 输出"JU"
Console.WriteLine(s.ToUpperInvariant().Substring(0, 2).EndsWith("UM")); // 输出False

上述代码都没有也不能修改字符串s,ToUpperInvariant、Substring都创建了新字符串。如果要大量执行字符串操作,就使用StringBuilder类。
6.以文本框形式输出:MessageBox.Show("a", "b"); // 第一个参数是正文,第二个参数是标题,记得加using System.Windows.Forms;

14.3高效率构造字符串:StringBuilder

特点:1.本质是字符数组;2.是可变字符串,能自动扩容。
常用的StringBuilder的成员:Length、Tostring()将StringBuilder字符数组转换成String、Clear()清除StringBuilder对象的内容、Append()在末尾加一个对象、Insert()、AppendFormat()在末尾加多个对象、Replace()这个方法很好用、Remove()等。举例:

// C#不将StringBuilder视为基元类型,所以要像构造非基元类型那样构造StringBuilder对象:
StringBuilder sb = new StringBuilder("jumper");
sb.Append("chn");
sb.AppendFormat("{0}-{1}-{2}", " can", "do", "it.").Replace('-', ' ').Insert(8, 'e').Remove(4, 2);
Console.WriteLine(sb.ToString() + " Length:" + sb.Length.ToString()); 
// 输出:jumpchen can do it. Length:19

另外,由于StringBuilder提供的API并不完整,比如:String提供的ToLower()、Trim()删除字符串头部及尾部的所有空格。这时就需要将StringBuilder和String提供的API配合使用了:

string sbStr = sb.ToString().ToUpper(); // 将StringBuilder转换为String以使用String的ToUpper()
sb.Clear();
sb.Append(sbStr); // 将String转换为StringBuilder以使用StringBuilder的Insert()
sb.Insert(0, "Real_");
Console.WriteLine(sb.ToString());
输出:Real_JUMPCHEN CAN DO IT.

是挺麻烦的,希望以后Microsoft能进一步完善StringBuilder类。

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

Object类型实现的ToString只是返回对象所属类型的全名,FCL内建的很多核心类型(Int32、Double等)都重写了ToString。我们定义类时,可以考虑重写ToString以提供良好的调试支持。

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

ToString是从对象获得字符串,而Parse是从字符串获得对象,这并不是一个常见的操作。
在FCL中,所有值类型(比如:Int32)、DataTime、TimeSpan等都提供了Parse和TryParse方法。

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

UTF-16和UTF-8编码是目前最常用的字符编码方案。
使用UTF-8进行字符编码和解码,举例:

string s = "jump";
Encoding encodingUTF8 = Encoding.UTF8;

// 将字符串编码成字节数组
Byte[] encodedBytes = encodingUTF8.GetBytes(s); // GetBytes是Encoding.UTF8的方法
// BitConverter.ToString将指定的字节数组的每个元素的数值转换为其等效的十六进制字符串表示形式
Console.WriteLine(BitConverter.ToString(encodedBytes));

// 将字节数组解码回字符串
String decodedString = encodingUTF8.GetString(encodedBytes); // GetString是Encoding.UTF8的方法
Console.WriteLine(decodedString);

//输出:
6A-75-6D-70
jump

UTF-8的使用途径再举例:StreamReader sw = new StreamReader(fs, Encoding.UTF8)其中fs是FileStream类型,用指定的数据流和指定的字符编码方案UTF-8 初始化 StreamReader的一个对象sw。再用sw.ReadToEnd();就可以得到字符串了。

14.7安全字符串

对于敏感数据(比如:密码),FCL添加了更安全的字符串类,即System.Security.SecureString,构造SecureString的对象时,会分配一个非托管内存块,其中包含一个字符数组,使用非托管内存是为了避开GC的“魔爪”。SecureString类实现了IDisposable接口,开发人员可以确定性地摧毁安全字符串。

猜你喜欢

转载自blog.csdn.net/BillCYJ/article/details/90768107