2025-09-29
C#
00

摘要

在 C# 中,List<T>.FindAll 和 LINQ 的 Where 方法都用于从集合中筛选出满足特定条件的元素。尽管它们的目的相同,它们的实现和一些特性存在差异。

正文

类型限制

List<T>.FindAllList<T> 类型的一个方法,它仅适用于 List<T> 实例。

C#
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; List<int> evenNumbers = numbers.FindAll(x => x % 2 == 0); // 返回 [2, 4]

image.png

Where 是一个 LINQ 扩展方法,适用于任何实现了 IEnumerable<T> 接口的类型,这意味着它可以用于数组、集合、列表等。

2025-09-29
C#
00

摘要

在C#中,元组(Tuples)是一种非常实用的数据结构,它允许你将多个值组合成一个单一的、轻量级的数据结构。自从C# 7.0引入了值元组(ValueTuple),它们的使用变得更加方便和高效。在本文中,我们将探讨C#中元组的常见应用场景,并提供一些示例。

正文

特点

  • 简洁性:元组允许你快速地定义一个数据结构,而不需要事先定义一个类或结构体。
  • 可读性:通过元组的语法糖,你可以给元组的每个元素命名,这使得代码更加可读。
  • 不可变性:元组是不可变的,一旦创建,其内容就不能更改。
  • 直观的解构:元组可以很容易地被解构到单独的变量中。

应用场景

元组通常用于以下场景:

  1. 方法多值返回:当你的方法需要返回多个值,而这些值又不足以构成一个完整的类时。
  2. 临时数据结构:当你需要一个轻量级的数据结构来传递一组值,而不打算在其他地方使用它时。
  3. 数据分组:在LINQ查询中,元组可以用来将数据分组成有意义的单元。
2025-09-29
C#
00

摘要

在 C# 中,TaskValueTask 都用于表示异步操作。Task 是一种常用的方式来表示将来某个时候会完成的工作。然而,在某些场景下,ValueTask 可以提供更好的性能,特别是当操作经常同步完成或者方法结果可以被缓存时。ValueTask 是 C# 7.0 引入的类型,它是一个结构体(struct),可以减少内存分配,从而提高性能。

正文

应用场景

ValueTask 相较于 Task 更适用于以下场景:

  1. 同步完成的异步方法:如果一个异步方法大多数情况下是同步完成的,使用 ValueTask 可以减少不必要的内存分配。
  2. 结果可以缓存的异步方法:如果异步操作的结果可以被缓存并且多次返回,ValueTask 可以帮助重用这些结果。
  3. 高性能要求的代码:对于性能敏感的代码,ValueTask 可以提供更少的内存分配和垃圾回收压力。

示例 1: 同步完成的异步方法

C#
public static async ValueTask<int> GetNumberAsync() { await Task.Delay(5000); // 模拟异步操作 return 42; // 常见的情况是同步返回结果 } public static async Task Main() { int number = await GetNumberAsync(); Console.WriteLine(number); // 输出:42 }
2025-09-29
C#
00

摘要

在 C# 中,局部函数和 Lambda 表达式都可以用来定义在方法内部的小型函数。然而,它们之间存在一些关键的差异。局部函数是 C# 7.0 引入的新特性,它们可以用来创建临时委托,而且在某些情况下比 Lambda 表达式更为高效和清晰。

正文

应用场景

局部函数相较于 Lambda 表达式更适用于以下场景:

  1. 性能敏感的代码:局部函数通常比 Lambda 表达式更高效,因为它们不会捕获外部变量时不会创建闭包。
  2. 递归调用:局部函数支持递归调用,而 Lambda 表达式则不那么直观。
  3. 复杂逻辑:对于包含多个步骤或变量的复杂逻辑,局部函数可以提供更好的可读性。
  4. 避免闭包的副作用:局部函数可以避免由于捕获外部变量而导致的不必要的堆分配。
2025-09-29
C#
00

摘要

在 C# 7 中,引入了 ref struct 类型,这是一个特殊的值类型,它被设计为栈分配,并且不能在托管堆上分配。ref struct 类型的主要目的是为了提供一种安全和高效的方式来处理那些与内存操作相关的场景。

正文

应用场景

ref struct 类型主要应用于以下场景:

  1. 性能关键型代码:当需要避免堆分配和垃圾回收时,ref struct 可以减少内存分配和提升性能。
  2. 内存管理:用于封装对非托管资源的操作,如直接内存访问或处理原始指针。
  3. 跨越调用:与平台调用(P/Invoke)结合使用,用于与非托管代码交互。
  4. Span 和 Memoryref struct 在 .NET 的 System.Memory 类库中被广泛使用,在处理内存切片和缓冲区时提供了安全的API。