kitlau
kitlau

kitlau's blog

C#


如何使用 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

如何使用 Optional 模式解决 C# 中的烦人的空引用问题

文章讨论了在C#中处理null值的两种方法:Optional模式和Nullable特性。作者通过示例代码展示了这两种方法的特点,并强调了Optional模式的优势,包括避免显式的null检查、减少NullReferenceException的风险以及在编译时就能发现潜在问题。与Nullable特性相比,Optional模式虽然可能让代码稍显复杂,但它通过函数式编程的概念提供了一种更安全和简洁的方式来处理可能为空的值。作者总结指出,在选择使用哪种方法时,可以根据项目的规模和团队成员的技术水平来决定,但两种方法都是有效的null引用解决方案。--DeepSeek

C# Null Handling Null Safety Optional Pattern Functional Programming Type System

Linq 和 lambda 的区别是什么?

这篇文章探讨了Linq和Lambda表达式之间的区别与联系,并反思了开发者对基础知识的忽视现象。作者通过代码示例说明,Linq(Language-Integrated Query)是一种查询库,提供多种语法形式,而Lambda是创建匿名委托的简洁方式,常用于Linq的方法语法中。两者虽紧密相关,但本质不同:Linq是一个功能库,而Lambda是一种表达式形式。文章指出,开发者往往因教材和文档中的同时出现而将它们混淆,并强调掌握基础知识的重要性。最后,作者建议读者探索表达式树的高级应用,并提出问题:你是否真正理解了这些基础概念,还是仅停留在表面应用上?这引发对学习方式和深度思考的反思。--DeepSeek

C# linq lambda expressions expression trees entity relationship mapping Method Syntax

C# required:跟 string 的空引用异常说再见

文章讨论了一个软件开发中的常见问题:属性类型设置错误导致线上bug,并结合C#11引入的`required`关键字探讨了如何避免此类问题。作者指出,在快速开发和压缩工时的环境下,开发者可能忽视基础质量保障,最终导致软件质量下降,影响用户体验。文中通过技术手段(如`required`关键字)与管理反思(批评急功近利的绩效考核模式),强调了在开发过程中重视代码质量和可维护性的重要性。同时,作者吐槽了团队中普遍存在的“外包模式”思维,认为这种做法会损害产品质量和用户信任,并呼吁在软件开发中避免牺牲质量以追求速度。--DeepSeek

C# Code Quality required keyword Nullables Engineering Practices Software Product Management

异步的原理是什么?C# 如何基于状态机实现异步?

C#异步实现的核心在于通过状态机管理async/await操作,MoveNext()方法负责从正确位置开始执行、保存状态并安排续延。快速路径指所有await操作均已完成,MoveNext()仅被调用一次;慢速路径则在遇到阻塞时暂停并安排续延,后续重新调用MoveNext()继续执行。异常处理通过builder传递而非抛出,"尚未启动"和"正在执行"状态合并以简化实现。整体流程包括从SetStateMachine到完成的各个阶段,展示了C#异步机制的高效与优雅。--DeepSeek

C# C# async programming State Machine Execution Paths Exception Handling Async Execution

什么是异步?异步就是多线程吗?异步就是 async、await 吗?

这篇文章详细介绍了C#异步编程的基础知识及其应用场景。首先,文章解释了`async`和`await`关键字的基本使用方法,并展示了如何在控制台应用程序中实现异步方法。接着,文章讨论了不返回值的异步方法以及如何处理这种情况。然后,通过对比同步与异步执行方式,文章强调了异步编程在提升程序性能和用户体验方面的重要性。 文章还详细介绍了如何先调用异步方法后`await`其结果,以实现多个任务的同时运行,并展示了这种方法的优势。此外,作者解释了不使用`async`修饰符的异步方法的实现方式,包括使用`Task.``FromResult()`和`Task.CompletedTask`来返回结果。 最后,文章介绍了如何通过`Task.WhenAll()`同时等待多个任务完成,以避免阻塞和提高效率。整篇文章旨在帮助开发者理解异步编程的基本概念和应用场景,并提供了一些实用的代码示例来说明这些概念。--DeepSeek

C# dotnet Async Await Task Parallelism Multithreading Task

EF Core 何时、为何使用 IsUnicode 方法

本文讨论了在Entity Framework Core中使用IsUnicode(false)时需谨慎考虑的因素,并通过实际案例说明了可能引发的问题。文章指出,varchar类型适合纯ASCII字符,而nvarchar支持Unicode字符;若错误配置可能导致数据存储问题。通过URL字段和用户输入的示例,作者提醒开发者不应低估用户的输入多样性。最后,介绍了EF Core 6引入的Unicode属性,并总结了软件开发中的潜在陷阱及建议。--DeepSeek

C# EF Core Entity Framework Core IsUnicode Method Database Design Model Configuration

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

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

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

手把手构建 C# 表达式树

这篇文章详细介绍了如何手动构建一个表达式树以筛选年龄大于18岁的人,包括创建参数、成员访问、比较运算符以及最终的Lambda表达式。作者展示了如何使用这个表达式在代码中过滤列表,并通过控制台输出结果。文章还讨论了手动编译表达式的必要性,提到如果使用`IQueryable`则不需要此步骤,并预告了两篇关于将表达式树应用于EF Core的文章,分别涉及动态构建表达式树来简化值对象比较和为实体类属性设置过滤器,而无需在每个配置中手动设置。--DeepSeek

.NET C# EF Core expression trees Dynamic Expression Linq Expressions

如何使用 CSharp 表达式树?

这篇文章介绍了如何手动构建C#表达式树以解决硬编码问题,并通过一个示例详细讲解了如何创建参数节点、成员访问节点以及组合成Lambda表达式的过程。文章还提到了表达式树在领域驱动设计中的潜在应用,但指出动态构建表达式树的代码可能较难理解,因此建议仅在必要时使用。最后,作者提供了相关的官方文档链接以供进一步学习。--DeepSeek

C# Functional Programming lambda expressions expression trees Dynamic Code Generation Property Access