1. C#基础20类概述
作为一名从VB6时代一路走来的老程序员,我见证了C#从1.0到10.0的完整进化历程。今天要分享的这个"C#基础20类"清单,是我带新人时必讲的核心内容,涵盖了日常开发中80%高频使用的场景。不同于教科书式的罗列,我会结合15年踩坑经验,告诉你每个类最实用的功能点和那些官方文档不会写的注意事项。
这20个基础类就像C#世界的瑞士军刀,从字符串处理到集合操作,从文件IO到多线程同步,构成了.NET生态的基石。掌握它们不仅能写出更健壮的代码,还能避免大量"重复造轮子"的情况。我见过太多初级开发者花半天时间实现一个功能,最后发现Framework里早已提供了现成方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心类库详解
2.1 System.String:字符串处理的艺术
String类可能是所有开发者接触的第一个类,但它的优化技巧常被忽视。比如连接大量字符串时:
csharp复制// 错误示范(产生中间垃圾字符串)
string result = "";
for(int i=0; i<10000; i++) {
result += i.ToString();
}
// 正确做法
var sb = new StringBuilder();
for(int i=0; i<10000; i++) {
sb.Append(i);
}
string finalResult = sb.ToString();
关键经验:字符串是不可变对象,任何修改操作都会创建新实例。在循环内拼接务必使用StringBuilder。
文化敏感性是另一个坑点:
csharp复制"straße".ToUpper() // 德国文化下输出"STRASSE"
"straße".ToUpperInvariant() // 始终输出"STRASSE"
2.2 System.Collections.Generic:泛型集合精髓
List
csharp复制// 已知元素数量时预分配容量
var list = new List<int>(1000);
var dict = new Dictionary<string, int>(500);
// 避免自动扩容带来的性能损耗
实测数据:当List元素超过初始容量时,扩容操作会使插入性能下降3-5倍。对于已知规模的集合,预分配容量是必备优化。
2.3 System.IO:文件操作防坑指南
File和Directory类看似简单,但有些陷阱需要注意:
csharp复制// 错误示范(可能引发资源泄露)
FileStream fs = File.Open("test.txt", FileMode.Open);
// 忘记调用fs.Dispose()
// 正确做法1
using (var fs = File.Open("test.txt", FileMode.Open)) {
// 操作文件
}
// 正确做法2(C#8.0+)
using var fs = File.Open("test.txt", FileMode.Open);
路径处理也有玄机:
csharp复制// 跨平台路径拼接
var path = Path.Combine("folder", "sub", "file.txt");
// 自动适配Windows的\和Linux的/
3. 多线程与异步编程
3.1 System.Threading基础
锁的使用有多个层级选择:
csharp复制// 轻量级场景
private readonly object _lockObj = new object();
lock(_lockObj) {
// 临界区代码
}
// 高性能场景
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
await _semaphore.WaitAsync();
try {
// 异步临界区
} finally {
_semaphore.Release();
}
血泪教训:静态成员的锁对象必须声明为static,否则会引发严重的线程安全问题。
3.2 Task异步编程模型
async/await的常见误区:
csharp复制// 错误示范(同步阻塞)
var result = GetDataAsync().Result;
// 正确做法
var result = await GetDataAsync();
// 特殊场景:需要同步等待时
var result = Task.Run(() => GetDataAsync()).GetAwaiter().GetResult();
配置await行为也很关键:
csharp复制// 默认会捕获上下文(在UI线程更新UI时有用)
await SomeOperationAsync();
// 性能优化:不需要上下文时
await SomeOperationAsync().ConfigureAwait(false);
4. 反射与特性实战
4.1 System.Reflection高级用法
动态加载程序集的安全考量:
csharp复制// 从文件加载
var assembly = Assembly.LoadFrom("plugin.dll");
// 安全建议:验证强名称签名
var name = assembly.GetName();
if(name.GetPublicKey().Length == 0) {
throw new SecurityException("未签名的程序集禁止加载");
}
4.2 自定义特性设计模式
创建可扩展的Attribute系统:
csharp复制[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AuditAttribute : Attribute {
public string Level { get; set; }
public AuditAttribute(string level) => Level = level;
}
// 使用示例
[Audit("High")]
public class SensitiveOperation { }
5. 序列化与反序列化
5.1 System.Text.Json性能优化
对比Newtonsoft.Json的配置差异:
csharp复制var options = new JsonSerializerOptions {
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
string json = JsonSerializer.Serialize(obj, options);
性能数据:System.Text.Json比Newtonsoft.Json快2-3倍,内存占用减少30%,但功能集稍弱。
5.2 二进制序列化技巧
[Serializable]的继承问题:
csharp复制[Serializable]
public class BaseClass {
[NonSerialized]
private string _tempData; // 不序列化字段
}
// 派生类也需要标记
[Serializable]
public class Derived : BaseClass { }
6. 日期时间处理
6.1 DateTime与DateTimeOffset
时区转换的正确姿势:
csharp复制var localTime = DateTime.Now;
var utcTime = localTime.ToUniversalTime();
// 更安全的做法
var offsetTime = DateTimeOffset.Now;
var utcOffsetTime = offsetTime.ToUniversalTime();
重要原则:永远不要在数据库中存储本地时间,UTC是唯一正确选择。显示时才转换为用户时区。
6.2 时间间隔计算
Stopwatch的精准计时:
csharp复制var sw = Stopwatch.StartNew();
// 执行代码
sw.Stop();
Console.WriteLine($"耗时:{sw.ElapsedMilliseconds}ms");
7. 数学运算与随机数
7.1 System.Math扩展方法
金融计算精度处理:
csharp复制decimal total = 0m;
for(int i=0; i<10; i++) {
total += 0.1m; // 使用decimal避免浮点误差
}
Console.WriteLine(total == 1.0m); // 输出True
7.2 安全的随机数生成
避免Random的线程安全问题:
csharp复制// 错误示范(多线程下可能返回0)
var random = new Random();
Parallel.For(0, 10, i => {
Console.WriteLine(random.Next());
});
// 正确做法
var random = new Random(Guid.NewGuid().GetHashCode());
8. 正则表达式优化
8.1 Regex编译选项
性能敏感场景的优化:
csharp复制// 预编译正则(启动稍慢但运行快)
var regex = new Regex(@"\d+", RegexOptions.Compiled);
// 简单场景用静态方法
if(Regex.IsMatch(input, @"^\w+$")) {
// ...
}
8.2 分组与替换技巧
复杂替换案例:
csharp复制string text = "订单号:ABC123, 金额:$45.67";
string pattern = @"金额:\$(?<amount>[\d.]+)";
var result = Regex.Replace(text, pattern, m => {
decimal amount = decimal.Parse(m.Groups["amount"].Value);
return $"金额:¥{amount * 6.5m}";
});
9. 环境与系统交互
9.1 命令行参数解析
使用System.CommandLine(.NET 6+):
csharp复制var rootCommand = new RootCommand {
new Option<string>("--name", "用户名"),
new Option<int>("--age", () => 18, "年龄")
};
rootCommand.SetHandler((name, age) => {
Console.WriteLine($"你好 {name}, 你 {age} 岁");
}, nameOption, ageOption);
return rootCommand.Invoke(args);
9.2 环境变量管理
跨平台环境变量访问:
csharp复制// 获取变量
string path = Environment.GetEnvironmentVariable("PATH");
// 设置变量(仅当前进程)
Environment.SetEnvironmentVariable("TEMPDIR", "/custom/temp");
// Windows特殊处理
if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
// 注册表操作等
}
10. 诊断与日志
10.1 Debug.Assert用法
条件编译的调试技巧:
csharp复制Debug.Assert(items != null, "items参数不应为null");
Debug.Assert(count > 0, "count必须大于0", $"实际值:{count}");
10.2 性能计数器
监控关键指标:
csharp复制using var pc = new PerformanceCounter(
categoryName: "Processor",
counterName: "% Processor Time",
instanceName: "_Total");
Console.WriteLine($"CPU使用率:{pc.NextValue()}%");
11. 加密与安全
11.1 哈希算法选择
密码存储的正确方式:
csharp复制using var alg = new Rfc2898DeriveBytes(
password: "userPassword",
salt: RandomNumberGenerator.GetBytes(16),
iterations: 10000,
hashAlgorithm: HashAlgorithmName.SHA256);
byte[] hash = alg.GetBytes(32); // 存储salt和hash
11.2 安全字符串处理
处理敏感数据:
csharp复制var secureString = new SecureString();
foreach(char c in "password") {
secureString.AppendChar(c);
}
// 使用完后立即清除
secureString.Dispose();
12. 全球化与本地化
12.1 资源文件最佳实践
多语言支持方案:
csharp复制var rm = new ResourceManager(
"MyApp.Resources.Strings",
Assembly.GetExecutingAssembly());
string greeting = rm.GetString("Welcome", CultureInfo.CurrentUICulture);
12.2 数字格式化规范
文化差异处理:
csharp复制double value = 1234567.89;
// 美国格式
Console.WriteLine(value.ToString("N2", new CultureInfo("en-US")));
// 输出 1,234,567.89
// 德国格式
Console.WriteLine(value.ToString("N2", new CultureInfo("de-DE")));
// 输出 1.234.567,89
13. 动态编程
13.1 ExpandoObject妙用
动态添加属性:
csharp复制dynamic person = new ExpandoObject();
person.Name = "张三";
person.Age = 30;
// 运行时添加方法
person.SayHello = (Action)(() => {
Console.WriteLine($"我是{person.Name}");
});
13.2 DynamicObject实现
自定义动态行为:
csharp复制public class DynamicDict : DynamicObject {
private readonly Dictionary<string, object> _dict = new();
public override bool TryGetMember(GetMemberBinder binder, out object result)
=> _dict.TryGetValue(binder.Name, out result);
public override bool TrySetMember(SetMemberBinder binder, object value) {
_dict[binder.Name] = value;
return true;
}
}
14. 内存管理
14.1 IDisposable模式
正确实现资源清理:
csharp复制public class ResourceHolder : IDisposable {
private bool _disposed;
protected virtual void Dispose(bool disposing) {
if(!_disposed) {
if(disposing) {
// 释放托管资源
}
// 释放非托管资源
_disposed = true;
}
}
~ResourceHolder() => Dispose(false);
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
}
14.2 ArrayPool优化
减少GC压力:
csharp复制var pool = ArrayPool<byte>.Shared;
byte[] buffer = pool.Rent(1024);
try {
// 使用buffer...
} finally {
pool.Return(buffer);
}
15. 网络操作
15.1 HttpClient工厂
避免端口耗尽:
csharp复制// 错误示范(每次new HttpClient)
// 正确做法(.NET Core+)
services.AddHttpClient("MyClient", client => {
client.BaseAddress = new Uri("https://api.example.com");
});
15.2 Socket高效编程
异步Socket示例:
csharp复制var socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
await socket.ConnectAsync("example.com", 80);
await socket.SendAsync(Encoding.UTF8.GetBytes("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"));
16. 进程与线程
16.1 Process启动控制
重定向输出示例:
csharp复制var psi = new ProcessStartInfo {
FileName = "dotnet",
Arguments = "--version",
RedirectStandardOutput = true,
UseShellExecute = false
};
using var process = Process.Start(psi);
string output = await process.StandardOutput.ReadToEndAsync();
16.2 ThreadLocal存储
线程特定数据:
csharp复制var threadLocal = new ThreadLocal<int>(() => {
return Thread.CurrentThread.ManagedThreadId;
});
Console.WriteLine($"线程ID:{threadLocal.Value}");
17. 并行编程
17.1 Parallel.ForEach配置
控制并行度:
csharp复制var options = new ParallelOptions {
MaxDegreeOfParallelism = Environment.ProcessorCount - 1
};
Parallel.ForEach(items, options, item => {
// 并行处理
});
17.2 PLINQ查询
并行化LINQ:
csharp复制var results = data.AsParallel()
.WithDegreeOfParallelism(4)
.Where(x => x.IsValid)
.Select(x => Transform(x))
.ToList();
18. 互操作
18.1 P/Invoke技巧
安全调用Win32 API:
csharp复制[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern int MessageBox(IntPtr hWnd,
string text, string caption, uint type);
// 使用示例
MessageBox(IntPtr.Zero, "Hello", "提示", 0);
18.2 COM互操作
释放COM对象:
csharp复制dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
try {
excel.Visible = true;
// 操作Excel...
} finally {
Marshal.FinalReleaseComObject(excel);
}
19. 诊断工具类
19.1 Stopwatch精准计时
高精度性能测量:
csharp复制var sw = Stopwatch.StartNew();
// 待测代码
sw.Stop();
long ticks = sw.ElapsedTicks;
double nanoseconds = (double)ticks / Stopwatch.Frequency * 1_000_000_000;
19.2 GC内存分析
强制垃圾回收(谨慎使用):
csharp复制// 仅用于调试目的
GC.Collect(2, GCCollectionMode.Forced, blocking: true, compacting: true);
GC.WaitForPendingFinalizers();
20. 扩展方法设计
20.1 集合扩展方法
增强IEnumerable功能:
csharp复制public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source) {
var rng = new Random();
var buffer = source.ToList();
for(int i=0; i<buffer.Count; i++) {
int j = rng.Next(i, buffer.Count);
yield return buffer[j];
buffer[j] = buffer[i];
}
}
20.2 字符串扩展
常用字符串操作封装:
csharp复制public static string Truncate(this string value, int maxLength,
string suffix = "...") {
return value?.Length > maxLength
? value.Substring(0, maxLength) + suffix
: value;
}
