在C#中 string 和 String 到底有什么区别?哪个才是正确的写法?
一、本质:同一个类型
C# 中 string 和 String 指向同一个类型------System.String。
csharp
// 以下两行完全等价
string a = "hello";
String b = "hello";
// 验证类型相同
Console.WriteLine(typeof(string) == typeof(String)); // True
Console.WriteLine(typeof(string).FullName); // System.String
核心解析:
-
string :C# 关键字,编译时自动映射为System.String -
String :.NET 基类库中的完整类型名,需要using System;才能直接使用
划重点:
string 是语法糖,String 是真实类型。就像int 对应System.Int32,bool 对应System.Boolean。
二、使用场景:何时用哪个
2.1 变量声明:推荐 string
csharp
// ✅ 推荐:关键字更简洁
string name = "张三";
string message = "Hello World";
// ❌ 不推荐:写法啰嗦
String name = "张三";
2.2 调用静态方法:推荐 String
csharp
// ✅ 推荐:静态方法用 String 更清晰
string result = String.Format("Hello {0}", name);
bool isEmpty = String.IsNullOrEmpty(name);
// 也可以,但不够直观
string result = string.Format("Hello {0}", name);
2.3 类名引用:必须用 String
csharp
// 反射、泛型约束等场景必须用 String
Type t = typeof(String);
var list = new List<String>();
三、编码规范:统一风格
推荐做法如下:
| 场景 | 推荐写法 | 原因 |
|---|---|---|
| 变量声明 | string |
关键字更简洁,符合 C# 风格 |
| 参数/返回值 | string |
保持一致性 |
| 静态方法调用 | String |
明确表示调用的是 .NET 类型方法 |
| 类型引用 | String |
反射、泛型等场景必须用 |
常见坑: 混用两种写法会导致代码风格不统一,降低可读性。先看一个混用示例:
csharp
// ❌ 混用风格
String GetName(string id) {
return String.Format("User_{0}", id);
}
// ✅ 统一风格
string GetName(string id) {
return string.Format("User_{0}", id);
}
四、性能差异
结论:没有性能差异。
csharp
// 编译后完全相同的 IL 代码
string a = "hello";
String b = "hello";
两者编译为相同的中间语言(IL),运行时行为完全一致。
五、总结
| 对比项 | string |
String |
|---|---|---|
| 本质 | C# 关键字 | .NET 类型 |
| 完整名称 | System.String |
System.String |
是否需要 using |
不需要 | 需要 using System; |
| 推荐场景 | 变量声明 | 静态方法/类型引用 |
| 性能 | 相同 | 相同 |
最后: 记住一个原则------变量声明用 string ,调用静态方法 / 引用类型名用 String 。 这不是技术问题,而是代码风格和可读性的选择。统一风格比纠结哪个"更正确"更重要。