英语原文共 48 页,剩余内容已隐藏,支付完成后下载完整资料
第12章 文本处理
在本章中,我将解释在Microsoft .NET Framework中使用单个字符和字符串的使用机制。 我将首先讨论System.Char结构以及可以操作角色的各种方法。 然后我将介绍更有用的System.String类,它允许您使用不可变的字符串。 (一旦创建,就不能以任何方式修改不可变的字符串。)在检查字符串之后,我将向您展示如何有效地执行各种操作以通过System.Text.-StringBuilder类动态构建字符串。 随着字符串基础知识的出现,我将描述如何将对象格式化为字符串以及如何使用各种编码有效地持久化或传输字符串。
字符
在.NET Framework中,字符始终以16位Unicode代码值表示,从而简化了全局应用程序的开发。 字符用System.Char结构的实例(值类型)表示。 System.Char类型非常简单。 它提供两个公共只读常量字段:MinValue(定义为0x0000)和MaxValue(定义为0xFFFF)。
给定Char的实例,您可以调用静态GetUnicodeCategory方法,该方法返回System.Globalization.UnicodeCategory枚举类型的值。此值指示字符是控制字符,货币符号,小写字母,大写字母,标点符号,数学符号等。(通过Unicode 3.0标准)。 为了简化开发,Char类型还提供了几种静态方法,例如IsDigit,IsLetter,IsWhiteSpace,IsUpper,IsLower,IsPunctuation,IsLetter-OrDigit,IsControl,IsNumber,IsSeparator,IsSurrogate和IsSymbol。 所有这些方法都在内部调用GetUnicodeCategory,只返回true或false。 请注意,所有这些方法都将参数或字符串的单个字符和String中的字符索引作为参数。
此外,您可以通过调用静态ToLower或ToUpper方法将单个字符转换为小写或大写等效字符。 对这些方法之一的调用使用与调用线程关联的文化信息(通过查询System.Threading.Thread的静态CurrentCulture属性在内部获取方法)转换字符; 或者您可以通过将System.Globalization.-CultureInfo类的实例传递给这些方法来指定特定区域性。 ToLower和ToUpper需要文化信息,因为字母大小写是一种与文化相关的操作。 例如,土耳其人认为U 0069的大写字母为U 0130,而其他文化认为结果为U 0049。
除了这些静态方法之外,Char类型还提供了一些自己的实例方法。 如果两个Char实例表示相同的16位Unicode代码点,则Equals方法返回true。 CompareTo方法(由IComparable接口定义)返回两个代码点的比较; 这种比较不是文化敏感的。 第15章解释了IComparable接口及其CompareTo方法的工作原理。 ToString方法返回由单个字符组成的String。 与ToString相反的是Parse,它采用单字符String并返回该字符。
最后一个方法GetNumericValue返回字符的等效数字。 以下代码演示:
using System;
class App {
static void Main() {
Double d;
// rsquo;\u0033rsquo; is the 'digit 3'
d = Char.GetNumericValue(lsquo;\u0033rsquo;); // rsquo;3rsquo; would work too
Console.WriteLine(d.ToString()); // Displays '3'
// rsquo;\u00bcrsquo; is the 'vulgar fraction one quarter (lsquo;ugrave;rsquo;)'
d = Char.GetNumericValue(lsquo;\u00bcrsquo;);
Console.WriteLine(d.ToString()); // Displays '0.25'
// rsquo;Arsquo; is the 'Latin capital letter A'
d = Char.GetNumericValue(lsquo;Arsquo;);
Console.WriteLine(d.ToString()); // Displays '-1'
}
}
最后,三种技术允许您在各种数字类型之间转换为Char实例,反之亦然。 这些技术按优先顺序列出:
- 转换将Char转换为数值(如Int32)的最简单方法是通过强制转换。 在这三种技术中,这是最有效的,因为编译器发出中间语言(IL)指令来进行转换,并且不需要调用任何方法。 此外,某些语言(例如C#)允许您指示是否应使用已检查或未检查的代码完成转换(在第5章中讨论)。 这使您可以决定在转换值时是否需要抛出System.OverflowException导致数据丢失。 此技术的唯一缺点是您的编译器必须将所需的数字类型视为基元。 因此,在Visual Basic中,您不能使用此技术将Char转换为UInt16(反之亦然),因为Visual Basic不会将UInt16视为基本类型。
- 使用Convert类型System.Convert类型提供了几种静态方法,这些方法知道如何将Char转换为数字类型,反之亦然。 所有这些方法都将执行转换作为已检查的操作,如果转换导致数据丢失,则会导致抛出OverflowException。
- 使用IConvertible接口Char类型和.NET Framework类库(FCL)中的所有数字类型实现IConvertible接口。 此接口定义ToUInt16和ToChar等方法。 此技术在三者中执行效率最低,因为在值类型上调用接口方法要求实例为box-Char,并且所有数值类型都是值类型。如果无法转换类型(例如将Char转换为布尔值)或转换导致数据丢失,则IConvertible的方法会抛出异常。 请注意,许多类型(包括FCL的Char和数字类型)将IConvertible的方法实现为显式接口成员实现(在第15章中描述)。 这意味着您必须先将实例强制转换为IConvertible,然后才能调用任何接口的方法。
以下代码演示了如何使用这三种技术:
using System;
class App {
static void Main() {
Char c;
Int32 n;
// Convert number lt;-gt; character using C# casting
c = (Char) 65;
Console.WriteLine(c); // Displays 'A'
n = (Int32) c;
Console.WriteLine(n); // Displays '65'
c = unchecked((Char) (65536 65));
Console.WriteLine(c); // Displays 'A'
// Convert number lt;-gt; character using Convert
c = Convert.ToChar(65);
Console.WriteLine(c); // Displays 'A'
n = Convert.ToInt32(c);
Console.WriteLine(n); // Displays '65'
// This demonstrates Convertrsquo;s range checking
try {
c = Convert.ToChar(70000); // Too big for 16 bi
ts
Console.WriteLine(c); // Doesnrsquo;t execute
}
catch (OverflowException) {
Console.WriteLine('Canrsquo;t convert 70000 to a Char.');
}
// Convert number lt;-gt; character using IConvertible
c = ((IConvertible) 65).ToChar(null);
Console.WriteLine(c); // Displays 'A'
n = ((IConvertible) c).ToInt32(null);
Console.WriteLine(n); // Displays '65'
}
}
System.String类型
当然,任何应用程序中最常用的类型之一是System.String。 String表示不可变的有序字符集。 String类型立即从Object派生,使其成为引用类型。 (没有字符串存在于线程的堆栈上。)String类型还实现了几个接口(IComparable,ICloneable,IConvertible和IEnumerable)。
构建字符串
许多编程语言(包括C#)都认为String是一种原始类型 - 也就是说,编译器允许您直接在其源代码中表达文字字符串。 编译器将这些文字字符串放在模块的元数据中,并在运行时使用称为字符串实习的机制访问它们(我将在本章后面讨论)。
在C#中,您不能使用new运算符来构造String对象:
using System;
class App {
static void Main() {
String s = new String('Hi there.'); // lt;— Error
}
}
相反,您必须使用以下特殊和简化的语法:
using System;
class App {
static void Main() {
String s = 'Hi there.';
}
}
如果您要编译此代码并检查其IL(使用ILDasm.exe),您将看到以下内容:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 7 (0x7)
.maxstack 1
.locals (string V_0)
IL_0000: ldstr 'Hi there.'
IL_0005: stloc.0
IL_0006: ret
} // end of method App::Main
构造对象的新实例的IL指令是newobj。 但是,IL代码示例中没有出现newobj指令。 相反,您会看到使用从元数据获取的文字字符串构造String对象的特殊ldstr(加载字符串)IL指令。 这表明CLR确实有一种构造String对象的特殊方法。
在极少数情况下,您可能需要一个不是由元数据中包含的文字字符串构造的String对象。 为此,您将使用C#的new运算符并调用String类型提供的构造函数之一。 采用Char *或SByte *参数的构造函数设计为可以使用带有Managed Extensions的C 编写的代码进行调用。 这些构造函数创建一个String对象,从Char实例数组或带符号字节初始化字符串。 其他构造函数没有任何指针参数,可以从任何托管编程语言调用。
C#提供了一些特殊的语法,可以帮助您将文字字符串输入到源代码中。 对于特殊字符,例如新行,回车符和退格键,C#使用C / C 开发人员熟悉的转义机制:
// String containing carriage-return and newline characters
String s = 'Hi\r\nthere.';
您可以使用C#的 运算符连接多个字符串以形成单个字符串,如下所示:
// Three literal strings concatenated to form a single literal st
ring
String s = 'Hi' ' ' 'there.';
在这段代码中,因为所有字符串都是文字字符串,所以编译器在编译时将它们连接起来,最后在模块的元数据中只放置一个字符串“Hi there。”。 在非文字字符串上使用 运算符可在运行时执行连接。 要在运行时将多个字符串连接在一起,请不要使用 运算符,因为它会在垃圾回收堆中创建多个字符串对象。 相反,使用System.Text.StringBuilder类型(将在本章后面解释)。
最后,C#还提供了一种特殊的方式来声明一个字符串,其中引号之间的所有字符都被视为字符串的一部分。 这些特殊声明称为逐字字符串,通常在指定文件或目录的路径或使用正则表达式时使用。 这是一个例子:
// Specifying the pathname o
全文共40661字,剩余内容已隐藏,支付完成后下载完整资料
资料编号:[1057]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。