kitlau
kitlau

kitlau's blog

.NET


如何使用 AnduinOS 愉快的开发 .NET

本文详细介绍了如何通过VSCode在AnduinOS上愉快地开发.NET应用,并分享了一些实用插件的配置经验。文章从C# Dev Kit、Roslynator等核心插件的功能与使用限制谈起,探讨了微软许可证政策对开发者的影响,同时对比了Jetbrains Rider的部分功能。此外,还介绍了C# XML Documentation Comments和C# Namespace Autocompletion等提升编码效率的小工具,并提到GitHub Copilot的订阅价格问题。最后,作者总结了自己的配置经验,并邀请读者分享更多建议。--DeepSeek

.NET C# VSCode AnduinOS dotnet vscode-plugins github-copilot development-environment

你可能正在写内存泄漏的 .NET 代码!

这篇文章探讨了在C#/.NET开发中常见的内存泄漏问题及解决策略。文中指出,内存泄漏主要源于对象引用未被清除、集合未适当管理、缓存机制不当使用、委托或事件订阅未取消以及非托管资源未正确释放等。作者建议采用只读接口限制可变集合的修改、利用内置缓存组件以替代手动维护的缓存结构、确保及时解除事件订阅以防闭包捕获导致的对象保留、避免滥用静态变量并考虑弱引用、使用`using`语句强制释放非托管资源,并强调减少对终结器的依赖以提升性能。同时,对于涉及unsafe代码或低级内存操作时需格外谨慎。总结来看,内存泄漏的防治需要开发者在编码习惯和设计模式上多加注意,合理利用.NET框架提供的工具和特性来确保程序的稳定性和高效性。--DeepSeek

.NET Memory Leaks Closure Issues Unmanaged Resources Circular Dependencies Memory Caching Issues

5 分钟 .NET 单元测试极简入门

本文介绍了为.NET项目创建单元测试的基本步骤,包括使用Visual Studio或dotnet命令行工具创建xUnit测试项目,并添加必要的依赖包如NSubstitute和Moq。通过示例展示了如何编写单元测试,利用Arrange-Act-Assert模式验证业务逻辑功能,同时演示了NSubstitute的用法,用于模拟依赖对象并测试与外部系统的交互。文章还提供了多个实际场景下的测试案例,如书籍检索、年份过滤等,并讲解了如何配置模拟返回值和验证调用是否正确发生。最后,介绍了在IDE中运行和调试单元测试的方法,以及通过dotnet test命令执行测试的能力,总结了单元测试的重要性,并提到了未来可能涉及的集成测试内容,同时附上了作者寻求工作机会的信息。--DeepSeek

.NET Test xunit unit testing nsubstitute tdd

借 Moq 事件谈一谈单元测试的重要性

这篇文章讨论了开源软件安全性和单元测试的重要性。作者提到最近GitHub上发生的一个关于恶意NuGet包的事件,强调审查和测试第三方库的必要性。随后,文章转向单元测试,解释其在提高代码质量和确保功能正确方面的作用,并列举不写单元测试带来的问题,如降低代码可维护性和项目健康度,以及在未来开发中增加难度。作者还用一个恶性循环图展示了忽视单元测试的危害,并呼吁国内开发者和公司更重视单元测试。最后,文章附上了一则求职广告,希望寻找青岛base或远程工作的机会。--DeepSeek

.NET Test unit testing Software Development Code Quality Software Development Methodology

一幅漫画解释 .NET 垃圾收集(GC)原理

本文通过一幅漫画科普了 .NET 垃圾收集(GC)的基本原理,并结合实际工作中的观察,指出了国内普通开发者对基础知识掌握不足的问题。作者认为,虽然当前工作环境可能将开发者视为流水线代码工,但从性能优化的角度切入学习仍是一个值得探索的方向,而减少 GC 压力则是 .NET 性能优化的重要切入点。 漫画来自 Redgate 的经典科普内容,尽管该内容主要针对 .NET Framework 时代,但其核心原理在现代 .NET 中依然适用。作者分享了这幅漫画的翻译,并提到了大对象堆(LOH)压缩问题的一个解决方案:将 GCSettings.LargeObjectHeapCompactionMode 设置为 CompactOnce。然而这一方案仅能在一个 GC 周期内生效,本质上回到了手动内存管理的方式,这也引发了对如何有效管理和优化 LOH 的进一步思考。 这篇文章不仅帮助开发者理解 .NET GC 的基本机制,还通过实际案例展示了性能优化的复杂性。对于想要深入了解 .NET 内存管理、GC 机制以及性能优化的同学来说,本文是一个不错的起点。你是否也曾在工作中遇到过因 GC 压力导致的性能问题?如何在现代 .NET 环境中更好地管理和优化 LOH 呢?这些问题值得每一位开发者深入思考和探索。--DeepSeek

.NET dotnet garbage collection performance optimization large object heap comic translation

.NET 是如何编译的?如何阅读中间语言?

C#代码的编译过程分为几个关键步骤:首先,编写C#源代码;其次,通过Roslyn编译器将其转换为中间语言(IL);然后,在运行时由JIT编译器将IL转换为机器码。文章详细解释了每个阶段的工作原理,包括编译器如何解析代码、生成IL的结构以及JIT如何优化性能以实现跨平台兼容性。此外,文章还介绍了如何阅读和理解IL代码,这对分析代码性能和执行过程有所帮助。--DeepSeek

.NET performance optimization C# Compilation Intermediate Language JIT Compiler .NET Framework

【译】.NET SDK 将会内置容器支持,不再需要 Dockerfile

这篇文章介绍了DotNet SDK构建容器镜像的功能,讨论了其优势和应用场景,如简化容器化过程、避免手动编写Dockerfile的复杂性等,并提供了使用示例。文章还详细说明了当前功能的限制,包括不支持Windows镜像、非x64架构、推送远程仓库以及某些镜像元数据定制等,并指出这些功能将在未来的版本中逐步完善。此外,作者鼓励开发者尝试这一新功能,并表示会持续改进,最终将其直接集成到DotNet SDK中,同时提供了GitHub里程碑和包资源以供跟踪最新进展。--DeepSeek

.NET Docker .NET SDK Container Builds Linux x64 GitHub Actions

还在背依赖注入的概念?不如自己写一个依赖注入框架

在控制台应用中使用依赖注入时,Singleton 和 Scoped 生命周期的行为并不完全相同。通过代码示例展示了即使在控制台环境中,Scoped 服务在不同作用域(Scope)下会生成不同的实例,而 Singleton 服务在整个应用程序生命周期内始终保持唯一实例。文章还指出,有些人错误地认为在控制台应用中 Scoped 与 Singleton 的行为一致,但事实并非如此。进一步说明了即使注册为 Singleton 的服务,在某些特定情况下也可能获取到不同的实例。文章批评了应试教育式的编程学习方式,强调这种教学方法扼杀创造力,并呼吁采用更实践和深入的学习方法来理解依赖注入的真正机制。--DeepSeek

.NET DependencyInjection Dependency Injection Service Lifecycles Software Engineering Design Patterns

EF Core 动态构建表达式树简化 DDD 值对象的比较

这篇文章主要介绍了如何通过构建动态表达式树来生成复杂的SQL查询语句。作者详细讲解了使用`ValueObjectEqualHelper`方法的实现细节,包括如何处理原始类型和非原始类型的相等比较,以及如何将多个属性条件组合成一个逻辑与(AndAlso)的表达式树。最终生成的SQL语句正确,并且能够准确返回预期的结果。文章还提供了相关的代码示例和注释,帮助读者更好地理解动态表达式树的构建过程,并建议进一步阅读作者之前关于C#表达式树的文章以加深理解。--DeepSeek

.NET C# EF Core expression trees Entity Framework Core Dynamic Condition Generation

EF Core 动态构建表达式树为所有实体设置软删除的查询过滤器

作者通过使用Entity Framework Core的查询过滤功能和动态生成的表达式树,成功地为每个实体类自动生成了SoftDelete标记的过滤条件,从而避免了手动重复编写代码。这种方法不仅减少了代码冗余,还提高了项目的可维护性和扩展性,并且可以通过调用IgnoreQueryFilters方法来禁用自动过滤以获取所有数据。--DeepSeek

.NET EF Core lambda expressions Entity Framework Core Dynamic Expression Trees Soft Delete