kitlau
kitlau

kitlau's blog

C#


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

这篇博客文章主要探讨了如何使用 Optional 模式解决 C# 中的空引用问题。首先,文章指出空引用异常是编程中常见的问题,常规的处理方法是在出错的代码位置添加判断,然后修复。然后,文章引入了 C# 中新引入的可空引用类型特性,但这个特性也带来了新的问题,如代码中充满了各种 null check 和 null guard。因此,文章提出了使用 Optional 模式来解决这个问题。Optional 模式提供了一种优雅的方式来处理可空值,避免了使用 null 值。文章还介绍了如何实现 Optional 模式,并提供了相关的代码和使用示例。最后,文章比较了 Nullable 和 Optional 模式,认为它们都是不错的解决空引用的方案,但选择哪种方案需要根据项目的大小和参与项目的成员等因素来决定。那么,你会选择哪种方式来解决空引用问题呢?--GPT 4

C#

Linq 和 lambda 的区别是什么?

本篇博客探讨了LINQ和lambda表达式的关系和区别。首先,LINQ(Language-Integrated Query)是一个库,包含一组可以使用lambda表达式的扩展方法,例如Where。文章通过代码示例详细解释了如何使用LINQ进行查询。其次,lambda表达式是一种更简单的构造匿名委托的方法,也被称为语法糖。它们经常在使用方法语法的LINQ中出现,这可能是人们常常把它们混淆的原因。文章再次通过代码示例解释了如何使用lambda表达式。最后,文章总结了lambda表达式实际上是一种比匿名方法更简单的委托创建方式,LINQ则可以通过表达式树把C#的查询语句转换成其他形式的查询语句,例如SQL语句。文章最后引用了一些相关的博客,供读者深入学习。那么,你是否清楚了LINQ和lambda表达式的区别呢?是否理解了它们各自的作用和用途呢?--GPT 4

C#

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

这篇博客深入讨论了C#编程中的一个常见问题:空引用异常。首先,介绍了空引用异常的起源和常见情况,特别是在处理字符串数据时,由于字符串的默认值是null,这会导致很多误解。接着,详细解析了在C# 11之前如何解决这个问题,包括使用问号声明符号来声明可为null的字符串,以及使用null!来告诉编译器字符串绝对不会为null。然后,介绍了C# 11引入的required关键字,这个关键字可以直接声明字符串必须在对象初始化器里赋值,从而一步到位解决问题。最后,作者对当前的开发环境进行了吐槽,认为急功近利的开发环境会导致软件质量下降。这篇博客不仅提供了技术解决方案,也引发了对开发环境的思考:我们是否应该牺牲软件质量以追求快速开发?--GPT 4

C#

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

本篇博客详细解析了异步的原理以及C#如何基于状态机实现异步。首先,文章介绍了C#中的异步方法,包括其结构、状态机的工作方式以及如何通过IAsyncStateMachine接口实现异步。然后,博客详细讲解了状态机的MoveNext()方法,包括它的工作原理,如何在异步方法第一次调用时被调用,以及每次恢复执行时都被调用一次。文章还解释了在await表达式时,有两种可能,await的异步操作尚未完成,或者已经完成。最后,博客总结了MoveNext()方法的工作流程,并通过流程图形象地展示了异步方法的执行过程。那么,为什么“尚未启动”和“正在执行”状态用同一个值表示?这篇博客是否能帮助你理解C#异步的实现呢?--GPT 4

C#

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

这篇博客主要探讨了异步编程的一些基本概念和用法,包括异步方法的调用、async/await关键字的作用以及异步方法的执行顺序等。通过一系列的示例,我们可以看到异步方法在被调用时就会立即开始执行,而await关键字则是用来等待异步方法执行完成并获取返回结果。在调用异步方法和await这个异步方法返回的Task之间,我们还可以去做其他事情,比如再运行一个与之前的异步方法无关的异步方法。此外,这篇博客还介绍了如何在不使用async修饰的情况下编写异步方法,以及如何使用Task.WhenAll()来同时等待多个Task完成。最后,作者指出虽然这篇文章只讲了异步编程的一些表象,但已经足够用来进行开发,如果要深入理解异步编程的原理,还需要进一步的学习和实践。那么,你是否已经理解了这些异步编程的基本概念和用法呢?你是否已经准备好放心大胆地使用异步编程了呢?--GPT 4

C#

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

这篇博客主要讨论了EF Core中`IsUnicode()`方法的使用时机和原因。首先,作者通过实验发现,`IsUnicode()`对MariaDB没有什么用,对MSSQL Server则会改变C# string类型的属性在数据库中的数据类型。当不使用`IsUnicode()`或配置为`IsUnicode(true)`时,生成的数据库表中对应string字段的数据类型为`nvarchar`,而配置`IsUnicode(false)`时则为`varchar`。因此,作者建议,当我们确定一个string类型的属性是ASCII安全的时候,即这个属性的值只会包含数字、英文字母和英文符号时,可以为它配置`IsUnicode(false)`,这样它在数据库中就是`varchar`类型。但如果你不确定,最好还是保持默认。此外,作者还分享了他的一些经验,例如对于ASCII安全的字符串来说,`nvarchar`要比`varchar`多占1倍的存储空间,而且还要考虑性能的影响。在博客的最后,作者介绍了EF Core 6中引入的新特性:Unicode Attribute,并总结了软件开发中需要注意的一些问题。--GPT 4

C# EF Core

如何使用 CSharp 表达式树?

本篇博客详细介绍了如何使用 CSharp 表达式树,通过一个实际的例子展示了如何手动构建表达式树。博文首先解释了表达式树的概念,并通过 C# 中的语法树为读者提供了直观的理解。接着,博文对 .NET 中的 `Expression<TDelegate>` 类型进行了详细的解析,并通过代码示例展示了如何从 lambda 表达式生成 `Expression<TDelegate>` 类型的变量,以及如何将其编译成 `TDelegate` 类型的委托对象。然后,博文通过一个实际的例子,详细地介绍了如何手动构建表达式树,包括如何构建叶子节点和根节点,以及如何编译和调用表达式树。最后,博文提到了表达式树在简化值对象比较中的应用,并给出了相关的参考文档链接。那么,表达式树是否真的能够避免硬编码,从而使代码更易于维护呢?阅读全文,你将得到答案。--GPT 4

C#

  • 1