C编程中的字符串、数组与索引器详解
立即解锁
发布时间: 2025-08-20 00:58:59 阅读量: 1 订阅数: 4 


深入解析C#与.NET框架应用开发精髓
### C# 编程中的字符串、数组与索引器详解
#### 1. 字符串基础
在实际编程中,字符和字符串是非常重要的数据类型。C# 提供了 `string` 类型,它是 `System` 命名空间中 `String` 类的别名,属于引用类型。`String` 类提供了许多字符串功能,C# 编译器也提供了额外支持,让字符串操作更简洁直观。
##### 1.1 字符
C# 使用 `char` 原始数据类型来表示单个字符,字符字面值用单引号括起来,例如:
```csharp
char ch1 = 'a';
```
C# 中的 `char` 内部表示为无符号的双字节整数,可以在 `char` 和整数数据类型之间进行来回转换:
```csharp
char ch1 = 'a';
int n = (int) ch1;
n++;
ch1 = (char) n; // ch1 现在是 'b'
```
关系运算符(如 `==`、`<`、`>` 等)也适用于 `char` 类型:
```csharp
char ch1 = 'a';
char ch2 = 'b';
if (ch1 < ch2) { // 表达式为真
// 执行相应操作
}
```
##### 1.2 ASCII 和 Unicode
传统上,使用单字节字符编码 ASCII 来表示字符,它简单紧凑,但无法表示世界上众多不同的字母表。现代计算机系统更倾向于使用双字节字符编码 Unicode,大多数现代(以及许多古代)字母表都可以用 Unicode 字符表示,ASCII 是 Unicode 的子集,对应前 255 个 Unicode 字符代码。C# 使用 Unicode 来表示字符。
##### 1.3 转义序列
在 C# 程序中,可以使用以 `\u` 开头、后跟十六进制数字的特殊转义序列来表示任何 Unicode 字符,例如:
```csharp
char A = '\u0041'; // 41(十六进制)是 65(十进制)或 'A'
```
此外,还为一些标准的非打印字符和难以直接表示的字符(如引号)提供了特殊转义序列,如下表所示:
| 转义字符 | 名称 | 值 |
| ---- | ---- | ---- |
| `\'` | 单引号 | `0x0027` |
| `\"` | 双引号 | `0x0022` |
| `\\` | 反斜杠 | `0x005C` |
| `\0` | 空字符 | `0x0000` |
| `\a` | 警报 | `0x0007` |
| `\b` | 退格 | `0x0008` |
| `\f` | 换页符 | `0x000C` |
| `\n` | 换行符 | `0x000A` |
| `\r` | 回车符 | `0x000D` |
| `\t` | 水平制表符 | `0x0009` |
| `\v` | 垂直制表符 | `0x000B` |
#### 2. String 类
`String` 类直接继承自 `Object`,并且是一个密封类,这意味着不能从 `String` 类进一步继承。`String` 类的实例是不可变的,即一旦创建了字符串对象,在其生命周期内就不能更改。看似修改字符串的操作实际上会返回一个新的字符串对象。如果为了提高效率需要直接修改类似字符串的对象,可以使用 `StringBuilder` 类。
字符串具有基于零的索引,可以用于访问字符串中的单个字符,例如:
```csharp
string s1 = "bat";
char ch = s1[0]; // 包含 'b'
```
默认情况下,字符串的比较操作是区分大小写的,但 `Compare` 方法有一个重载版本允许进行不区分大小写的比较。空字符串应与 `null` 区分开来,如果字符串未被赋值,则它是一个 `null` 引用,任何字符串(包括空字符串)都比 `null` 引用大,两个 `null` 引用相互比较时相等。
#### 3. C# 语言对字符串的支持
##### 3.1 字符串字面值和初始化
可以通过将字符序列用双引号括起来来定义字符串字面值,特殊字符可以使用前面讨论的转义序列来表示。也可以使用 `@` 符号定义“逐字”字符串字面值,在逐字字符串中,转义序列不会被转换,而是按原样使用。如果要在逐字字符串中表示双引号,使用两个双引号。正确的用字面值初始化字符串变量的方法是在等号后面提供字面值,不需要像其他数据类型那样使用 `new` 关键字,示例如下:
```csharp
string s1 = "bat";
string path1 = "c:\\OI\\NetCs\\Chap3\\Concat";
string path = @"c:\OI\NetCs\Chap3\Concat\";
string greeting = @"""Hello, world""";
```
##### 3.2 字符串连接
`String` 类提供了 `Concat` 方法用于连接字符串,在 C# 中也可以使用 `+` 和 `+=` 运算符来执行连接操作,示例程序如下:
```csharp
// Concat.cs
using System;
public class Concat
{
public static void Main(string[] args)
{
string s1 = "bat";
Console.WriteLine("s1 = {0}", s1);
string s2 = "man";
Console.WriteLine("s2 = {0}", s2);
s1 += s2;
Console.WriteLine(s1);
string path1 = "c:\\OI\\NetCs\\Chap3\\Concat";
Console.WriteLine("path1 = {0}", path1);
string path = @"c:\OI\NetCs\Chap3\Concat\";
string file = "Concat.cs";
path = path + file;
Console.WriteLine(path);
string greeting = @"""Hello, world""";
Console.WriteLine(greeting);
}
}
```
该程序的输出如下:
```
s1 = bat
s2 = man
batman
path1 = c:\OI\NetCs\Chap3\Concat
c:\OI\NetCs\Chap3\Concat\Concat.cs
"Hello, world"
```
#### 4. 字符串比较和输入
##### 4.1 字符串比较
比较字符串是否相等的基本方法是使用 `String` 类的 `Equals` 方法,该函数有多个重载版本,包括一个接受两个字符串参数的静态版本和一个接受一个字符串参数并与当前实例进行比较的非静态版本,这些方法对字符串的内容进行区分大小写的比较,返回 `bool` 类型的值(`true` 或 `false`)。如果要进行不区分大小写的比较,可以使用 `Compare` 方法,该方法有多个重载版本,都是静态的,比较两个字符串 `s1` 和 `s2`,返回一个整数表示两个字符串之间的词法关系,如下表所示:
| 关系 | 返回值 |
| ---- | ---- |
| `s1` 小于 `s2` | 负整数 |
| `s1` 等于 `s2` | 0 |
| `s1` 大于 `s2` | 正整数 |
第三个参数可以控制比较的大小写敏感性,如果只使用两个参数,则进行区分大小写的比较,第三个参数是 `bool` 类型,`false` 表示区分大小写,`true` 表示忽略大小写。
##### 4.2 字符串输入
`Console` 类提供了输入字符和字符串的方法,`Read` 方法读取单个字符(作为 `int` 类型),`ReadLine` 方法读取一行输入,以回车符、换行符或它们的组合结束,并返回一个字符串。一般来说,`ReadLine` 方法更易于使用,并且能很好地与 `Write` 和 `WriteLine` 方法同步。示例程序如下:
```csharp
// ReadStrings.cs
using System;
class ReadStrings
{
static void Main()
{
Console.Write("请输入名字: ");
string firstName = Console.ReadLine();
Console.Write("请输入中间名首字母: ");
string middleInitialInput = Console.ReadLine();
char middleInitial = middleInitialInput[0];
Console.Write("请输入姓氏: ");
string lastName = Console.ReadLine();
Console.WriteLine($"你输入的姓名是: {firstName} {middleInitial}. {lastName}");
}
}
```
#### 5. String 类的方法和属性
以下是 `String` 类的一些有用方法和属性:
- **Length*
0
0
复制全文
相关推荐










