net
-
C# 如何在WPF中实现数据验证 – IDataErrorInfo与INotifyDataErrorInfo
INotifyDataErrorInfo 支持异步、多错误实时验证,适合复杂场景;IDataErrorInfo 仅同步单错误,适用于简单表单。 在WPF中实现数据验证,IDataErrorInfo 和 INotifyDataErrorInfo 是两种主流接口,它们都支持绑定层自动高亮错误、显示提示,…
-
C#如何操作Excel文件?NPOI与EPPlus两大类库使用教程与对比
NPOI支持.xls和.xlsx格式,免费且无需Office;EPPlus仅支持.xlsx,功能强大但商业用途需授权。根据文件格式、许可证和功能需求选择合适工具。 在C#开发中,操作Excel文件是常见需求,比如导出报表、读取数据等。目前最流行的两个第三方库是NPOI和EPPlus。它们都功能强大、…
-
C# 如何实现一个LRU缓存 – 最近最少使用算法的C#实现
C#高效LRU缓存需用Dictionary+LinkedList实现O(1)的get/put:Dictionary映射key到链表节点,LinkedList按访问序维护节点,get时命中则移至尾部,put时更新或插入并超容删头。 用 C# 实现一个高效 LRU 缓存,关键在于让 get 和 put …
-
C# 如何处理图像文件 – System.Drawing与ImageSharp
优先选 ImageSharp;它跨平台、内存友好、支持新格式且线程安全,而 System.Drawing 仅限 Windows、易句柄泄漏且不支持 WebP/AVIF。 在 C# 中处理图像文件,System.Drawing 和 ImageSharp 是两个主流选择,但它们定位不同:前者是 Wind…
-
C# 如何生成随机数 – Random类的正确使用姿势
正确使用Random需注意实例化方式:应声明为静态只读字段复用,避免频繁新建导致重复;多线程下用ThreadLocal隔离实例防冲突;加密场景改用RandomNumberGenerator确保安全;高频操作可封装提升复用性。 生成随机数看似简单,但用错 Random 类很容易导致重复、不随机,甚至多…
-
.NET垃圾回收(GC)机制深度解析:开发者需要知道的一切
.NET的GC通过分代回收管理内存,对象分为Gen 0、Gen 1、Gen 2三代,基于生命周期长短分布于SOH或LOH;GC在内存不足等条件下触发,导致“暂停”,影响性能;支持工作站与服务器两种模式,前者适合客户端低延迟,后者多线程并行提升吞吐量;开发者应减少临时对象分配、复用大对象、避免内存泄漏…
-
C# Task.WhenAll和Task.WhenAny – 高效管理多个并行任务
Task.WhenAll等待所有任务完成,适合批量操作;Task.WhenAny响应首个完成的任务,适用于超时或降级场景。两者不启动任务,需先并行创建任务再传入,注意异常处理与并发控制。 Task.WhenAll 和 Task.WhenAny 是 C# 中协调多个异步任务的核心工具,它们不执行任务,…
-
C# 如何安全地存储用户密码 – 哈希与加盐(Salt)的最佳实践
安全存储用户密码应使用Argon2或BCrypt等强哈希算法,配合唯一随机盐值和足够计算成本;禁用MD5、SHA1等快速哈希;盐须每用户独立且由密码学安全随机数生成;哈希需包含算法、参数、盐并采用标准格式存储。 不要存储明文密码,也不要自己发明加密方式。安全存储用户密码的核心是:使用强哈希算法 + …
-
C# 如何处理JSON中的循环引用 – JsonSerializerSettings配置
System.Text.Json 默认不支持循环引用,会抛出异常以避免栈溢出和内存问题;推荐通过断开引用、[JsonIgnore] 特性或自定义 Converter 显式处理。 在 C# 中使用 System.Text.Json(.NET Core 3.0+ 默认 JSON 库)时,它默认不支持循环…
-
C# 反序列化xml时如何处理缺失的节点
使用可空类型和默认值可有效处理C#反序列化XML时的缺失节点。通过int?、DateTime?等可空类型避免异常,结合[XmlElement(IsNullable = true)]确保字段设为null而非报错。为属性设置默认值可在反序列化后补充逻辑。ShouldSerialize方法虽不直接影响反序…