1. C#基础20类概述
作为.NET生态的核心语言,C#的类体系设计体现了微软工程师对面向对象编程的深刻理解。我在实际开发中发现,掌握以下20个基础类不仅能快速构建健壮应用,更能深入理解CLR的运行机制。这些类分布在System命名空间及其子空间中,涵盖了数据类型处理、集合操作、文件IO、多线程等日常开发的核心场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心数据类型类解析
2.1 Object类 - 万物起源
所有类型的终极基类,提供Equals、GetHashCode等基础方法。实际编码时要注意:
- 重写Equals时必须同步重写GetHashCode
- 使用ReferenceEquals进行引用比较
- 示例:
csharp复制class MyClass {
public override bool Equals(object obj) {
if(obj is MyClass other)
return this.Id == other.Id;
return false;
}
public override int GetHashCode() {
return Id.GetHashCode();
}
}
2.2 String类 - 不可变性的艺术
字符串处理的基石类,其不可变性设计带来线程安全特性。关键技巧:
- 使用StringBuilder处理高频拼接
- 比较时用Ordinal代替CurrentCulture提升性能
- 内存优化示例:
csharp复制string s1 = "hello"; // 驻留化
string s2 = "hello"; // 复用同一引用
3. 集合与泛型类实战
3.1 List - 动态数组王者
最常用的泛型集合,内部实现是动态扩容数组。经验之谈:
- 预估容量时用构造函数指定初始大小
- 批量操作使用AddRange避免多次扩容
- 性能对比:
csharp复制var list = new List<int>(1000); // 预分配
for(int i=0; i<1000; i++) list.Add(i); // 无扩容开销
3.2 Dictionary<K,V> - 哈希表妙用
基于哈希表的键值对集合,注意要点:
- 自定义类型作Key需实现GetHashCode
- TryGetValue比ContainsKey+索引更高效
- 线程安全方案:
csharp复制var concurrentDict = new ConcurrentDictionary<string, int>();
4. IO与序列化类详解
4.1 FileStream - 文件操作核心
处理文件读写的底层类,重要细节:
- 使用using语句确保资源释放
- FileMode.OpenOrCreate可能触发文件覆盖
- 异步操作模板:
csharp复制async Task ReadFileAsync(string path) {
using var stream = new FileStream(path, FileMode.Open);
byte[] buffer = new byte[1024];
await stream.ReadAsync(buffer, 0, buffer.Length);
}
4.2 JsonSerializer - 现代数据交换
System.Text.Json中的序列化利器,实用技巧:
- 使用[JsonIgnore]排除属性
- 配置JsonSerializerOptions控制行为
- 性能优化方案:
csharp复制var options = new JsonSerializerOptions {
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
string json = JsonSerializer.Serialize(obj, options);
5. 多线程与异步类
5.1 ThreadPool - 线程管理智慧
托管线程池的核心类,使用守则:
- 适合短时任务,长时间任务应显式创建Thread
- 通过GetAvailableThreads监控资源
- 任务提交示例:
csharp复制ThreadPool.QueueUserWorkItem(state => {
Console.WriteLine($"线程{Thread.CurrentThread.ManagedThreadId}执行任务");
});
5.2 Task - 异步编程基石
TAP模式的核心类,开发要点:
- 避免async void方法
- 使用ConfigureAwait(false)减少上下文切换
- 组合任务模式:
csharp复制var task1 = Task.Run(() => FetchData());
var task2 = Task.Run(() => ProcessData());
await Task.WhenAll(task1, task2);
6. 反射与特性类
6.1 Type类 - 元数据之门
反射系统的入口类,典型用法:
- 获取类型信息的三种方式:
csharp复制Type t1 = typeof(string);
Type t2 = Type.GetType("System.String");
Type t3 = obj.GetType();
- 性能敏感场景考虑缓存Type对象
6.2 Attribute - 声明式编程
特性系统的基类,实用案例:
- 自定义验证特性:
csharp复制[AttributeUsage(AttributeTargets.Property)]
class RangeAttribute : Attribute {
public int Min { get; }
public int Max { get; }
public RangeAttribute(int min, int max) {
Min = min;
Max = max;
}
}
7. 日期与数学类
7.1 DateTime与TimeSpan
时间处理双雄,注意要点:
- 使用UtcNow而非Now处理跨时区场景
- TimeSpan表示时间间隔,可用于计算:
csharp复制var elapsed = DateTime.Now - startTime;
Console.WriteLine($"耗时:{elapsed.TotalSeconds}秒");
7.2 Math类 - 数学运算大全
包含常用数学方法,如:
- 金融计算使用Round的MidpointRounding参数
- 取整方法对比:
csharp复制Math.Floor(3.7); // 3
Math.Ceiling(3.2); // 4
Math.Truncate(-3.7); // -3
8. 异常处理类体系
8.1 Exception类层次
异常系统的基类,最佳实践:
- 自定义异常应继承ApplicationException
- 捕获特定异常而非通用Exception
- 异常处理模板:
csharp复制try {
RiskyOperation();
}
catch (IOException ex) {
Logger.Error(ex);
throw new CustomException("操作失败", ex);
}
finally {
Cleanup();
}
9. 加密与安全类
9.1 SHA256类 - 数据指纹
哈希算法的典型代表,使用模式:
csharp复制using System.Security.Cryptography;
byte[] ComputeHash(byte[] data) {
using var sha = SHA256.Create();
return sha.ComputeHash(data);
}
注意:哈希不可逆,用于验证数据完整性
10. 其他实用类
10.1 Guid类 - 全局唯一标识
生成唯一ID的利器:
csharp复制string newId = Guid.NewGuid().ToString("N");
// 输出示例:e0a953c3ee6040eaa9fae2b667060e09
10.2 Environment类 - 运行环境信息
获取系统信息的瑞士军刀:
csharp复制string osVersion = Environment.OSVersion.ToString();
int processorCount = Environment.ProcessorCount;
bool is64bit = Environment.Is64BitProcess;
11. 实战经验分享
在多年C#开发中,我总结出这些类的黄金组合:
- List
+ LINQ 处理集合数据 - Task + async/await 构建响应式应用
- JsonSerializer + HttpClient 实现Web API交互
一个典型错误案例:
csharp复制// 错误:在循环中拼接字符串
string result = "";
for(int i=0; i<10000; i++) {
result += i.ToString(); // 产生大量临时对象
}
// 正确:使用StringBuilder
var sb = new StringBuilder();
for(int i=0; i<10000; i++) {
sb.Append(i);
}
string finalResult = sb.ToString();
对于新手,建议从List
