kitlau
kitlau

kitlau's blog

.NET .NET


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

本篇博客讨论了.NET代码中的内存泄漏问题,主要包括七个方面。首先,定义了内存泄漏,即应用程序不再需要的对象仍然被其他对象引用,阻止垃圾收集器(GC)回收它们的内存。然后,通过实例代码详细介绍了匿名方法捕获类成员、事件的生命周期、使用静态变量、使用内存缓存、不进行Dispose处理以及错误使用unsafe或其他直接操作内存的方法等可能导致内存泄漏的场景,并给出了相应的解决方案。此外,博客还强调了在使用可能导致内存泄漏的编程技术时,必须清楚自己在做什么,避免不必要的内存泄漏问题。你是否也曾在.NET编程中遇到过这些问题?你又是如何解决的呢?--GPT 4

.NET

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

本篇博客文章向我们介绍了如何在.NET环境中进行单元测试的极简入门。文章首先介绍了单元测试的基本概念和其重要性,然后详细展示了如何使用xUnit, Fluent Assertions, NSubstitute等工具进行单元测试的编写。文章以一个实际的例子,演示了如何编写测试方法,如何进行Arrange、Act和Assert,如何使用模拟对象和如何进行断言。文章还介绍了如何运行单元测试,并展示了测试结果。文章最后总结了单元测试的核心内容,并预告了下一篇文章将会讲解如何利用单元测试重构旧的垃圾代码。阅读这篇文章,你是否对.NET单元测试有了新的认识?你是否已经迫不及待地想要尝试编写你的第一个单元测试了?--GPT 4

.NET Test

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

这篇博客主要讨论了.NET最著名的单元测试Mock库Moq的一个争议性功能,以及单元测试的重要性。Moq的这个功能会在用户构建使用了Moq的项目时扫描用户本地的git配置,获取用户的电子邮件地址并发送到Azure的某个服务上以检查用户是否是Sponsor。这个功能在.NET社区引起了广泛的讨论,有人谴责这个行为,有人维护Moq的原作者。作者指出,这个事件在国内社区并没有引起广泛的讨论,可能是因为国内的中小公司一般没有写单元测试的习惯。作者强调,单元测试是由开发人员来写的,不应该依赖物理上的数据库。单元测试可以提高代码的质量,减少错误,增加可读性,方便重构,提高开发效率等。相反,不写单元测试会对代码可维护性,项目的健康性,未来新需求的开发等,带来很大的破坏。希望国内的公司和开发者都能更重视单元测试。你认为单元测试的重要性被低估了吗?你的公司有写单元测试的习惯吗?--GPT 4

.NET Test

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

这篇博客主要讨论了.NET的垃圾收集(GC)原理。作者首先提到了许多普通dotnet开发者对dotnet的一些基础知识并不了解,这对他们的技术路线职业发展不利。在这种背景下,性能优化,尤其是从减少GC压力入手,成为了一个值得学习的点。作者随后翻译了一幅来源于Redgate的漫画,该漫画简单而直观地解释了dotnet GC的工作原理。同时,作者也提到了在dotnet 5中,GC新增了新的分代POH,但没有深入讨论。关于大对象堆(LOH)压缩问题,作者引用了@lorenzo_solano的解决方案,即设置`GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce`,但这个解决方案只在下一个GC周期有效。这篇博客为读者提供了一个关于.NET垃圾收集原理的基本科普,同时也引出了一些关于GC优化和内存管理的问题。你认为在什么情况下应该采用这种LOH压缩模式呢?这种模式的效果如何?这些问题可能需要你自己去寻找答案。--GPT 4

.NET

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

本篇博客详细解析了.NET中C#代码的编译过程,以及如何阅读中间语言(IL)。首先,通过dotnet build命令编译程序,编译器将C#高级代码编译成可执行文件中的中间语言代码。接着,解释了Common Intermediate Language(CIL,程序集层/汇编层)的概念,CLR可以将IL编译为Native code。博客还详细阐述了如何阅读IL,包括方法声明部分、方法内容部分的设置和执行等。最后,解释了从CIL到Native code的转换过程,这一步是在运行时由CLR调用JIT编译器完成的。通过本文,读者可以了解到.NET编译的全过程,以及如何阅读和理解IL。这对于理解.NET的工作原理,以及进行性能优化等方面都有很大的帮助。文章最后提出了一个问题:对比能达成相同结果的操作的性能和开销时,如何利用IL进行判断?--GPT 4

.NET

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

.NET SDK即将内嵌容器支持,无需再使用Dockerfile。此功能允许开发者自定义生成的镜像的许多方面,包括选择Base镜像、镜像版本和名称等。此外,开发者可以在本地开发和CI管道中使用此功能,以更简单的方式创建和管理容器镜像。然而,此功能的初始预览版本还存在一些限制,例如暂不支持Windows镜像和非x64架构,也暂时无法推送到远程registries。但在dotnet 7的rc阶段,这些问题将得到解决。此功能的目标是简化容器镜像的构建过程,使之更加直观和易用。然而,目前还无法使用dotnet SDK执行RUN命令,这可能影响到一些需要在操作系统级别进行定制的应用。然而,随着这个功能的不断开发,这些问题有望得到解决。那么,这个功能是否能够替代Dockerfile并成为主流的容器构建工具呢?这个问题可能需要时间来回答。--GPT 4

.NET

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

本篇博客以依赖注入(DI)框架为例,详细介绍了如何从零开始构建一个DI框架。首先,博客讲解了DI的基本概念,包括服务、服务描述符和服务提供者。接着,通过创建一个KServiceCollection类,实现了DI的基础功能。然后,通过使用KServiceCollection类创建一个KServiceProvider类,实现了服务的获取和注入。在此基础上,博客进一步讲解了如何通过创建单例和瞬态服务,实现不同生命周期的管理。最后,通过在控制台项目中创建新服务和重写Program.cs文件,进行了DI框架的测试。 此篇博客深入浅出地讲解了DI框架的构建过程,旨在帮助读者更好地理解DI的概念和应用。同时,博客也提出了一些有趣的问题,比如如何解决null值检查的问题,如何约束TImplement类型必须实现TService接口,如何实现Remove功能等,以引发读者的思考。而这些问题的解决,将是读者自己完成DI框架的关键步骤。 此外,博客也强调了编程学习的方式,批评了应试教育的学习方式,并指出这种方式对开发者创造力的扼杀。博客希望读者能够通过动手实践,真正理解和掌握编程知识。那么,你是否已经准备好,开始自己的DI框架构建之旅呢?--GPT 4

.NET DependencyInjection

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

本篇博客探讨了如何使用EF Core动态构建表达式树简化DDD值对象的比较。首先,文章讲述了如何在EF Core中使用值对象,以及遇到的问题。接着,文章提出了使用动态构建表达式树的查询作为解决方案,并详细解释了如何实现这个解决方案,包括创建一个名为`ValueObjectEqualHelper`的静态类,以及如何使用这个类中的`CheckEqual<T, TProperty>`静态方法。最后,博客展示了如何使用这个方法,并展示了生成的SQL脚本和输出结果。这个方法是否能够解决你在EF Core中使用值对象时遇到的问题呢?对于动态构建表达式树,你有什么其他的想法和建议吗?--GPT 4

.NET EF Core

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

这篇博客文章介绍了如何在EF Core中动态构建表达式树,实现对所有实体设置软删除的查询过滤器。首先,文章通过一个简单的实体类和一个实体配置类来演示如何在EF Core中设置查询过滤器。然后,文章提出了一个问题:如果项目中有大量的实体,每个实体都进行一次查询过滤器的配置将会非常麻烦。为了解决这个问题,文章引入了动态构建表达式树的方法。通过动态构建表达式树,我们可以在应用程序启动时,遍历所有的实体类型,对有软删除标志的实体动态设置查询过滤器。文章还演示了如何在查询时忽略查询过滤器,以及如何简化动态构建表达式树的代码。最后,文章预告了下一篇博客的主题,将会介绍如何使用动态构建表达式树来简化和语义化领域驱动设计中值对象的比较。这篇博客对于那些在EF Core中使用查询过滤器,或者需要动态构建表达式树的开发人员来说,将会有很大的帮助。那么,你是否已经想象出如何在你的项目中应用这些方法了呢?--GPT 4

.NET EF Core

如何在 CSharp 和 EF Core 中使用 UTC 时间

这篇博客主要讲述了如何在CSharp和EF Core中使用UTC时间,以及如何配合Mapster自动转换UTC时间到本地时间。首先,文章解释了什么是UTC时间,并详细描述了在C#中如何使用UTC时间,包括如何将所有DateTime和DateTime?类型且名称结尾为"Utc"的属性的Kind都设置为`Utc`。接着,文章介绍了如何配合EF Core使用UTC时间,通过在ApplicationDbContext.cs中进行设置,可以实现属性的批量转换。然后,文章探讨了如何便捷地使用UTC时间,将其转换为本地时间,包括三种常见的方式:给Product类再加`Created`和`Modified`两个属性,自定义一个Product类的DTO,或者使用AutoMapper或者Mapster等库来自动Mapping。最后,文章介绍了如何使用Mapster自动将UTC映射为本地时间。通过这些步骤,可以实现将ProductDto的Created和Modified都转换成美国的时间,避免了“在今天买到明天生产的牛奶”等问题。那么,你会选择哪种方式来使用UTC时间呢?--GPT 4

.NET