编辑
2025-10-02
C#
00

在现代企业应用程序开发中,处理复杂的主从数据结构是常见的需求。例如,在订单管理系统中,一个订单(主数据)会有多个订单项(子数据)。传统的关系型数据库可能需要多表关联和复杂的事务处理,而通过将子数据保存为JSON字符串,可以简化这些繁琐的操作。本文将详细介绍如何在C#中实现这个过程。

背景介绍

主数据与子数据

主数据与子数据的关系可以通过一个简单的实例来描述。假设我们有一个订单表(Order)和订单项表(OrderItem)。

  • 表结构:
    • Order 表:包含订单ID、客户ID、订单日期等
    • OrderItem 表:包含订单项ID、订单ID、商品ID、数量、单价等

优化思路

通过将 OrderItem 转换为 JSON 字符串,并将其存储到 Order 表中的一个字段中,可以简化数据结构和操作复杂性。虽然这种方法降低了数据的规范化程度,但在很多场景下,可以提高开发和维护效率。

编辑
2025-10-02
C#
00

引言

.NET 8 带来了一系列新特性和改进,旨在提升性能、引入高级语言特性,并扩展.NET框架的跨平台支持。本文将重点探讨.NET 8中的关键更新,特别是C# 12中的新语言功能。

C# 12 语言增强

1. 增强的模式匹配

C# 12提供了更强大的模式匹配功能,让我们能够编写更简洁、更富有表现力的代码。

列表模式

现在我们可以使用列表模式来匹配数组或列表的内容:

C#
public static void Main() { int[] numbers = { 1, 2, 3, 4, 5 }; if (numbers is [1, 2, .. var rest]) { Console.WriteLine($"The array starts with 1 and 2, followed by {rest.Length} more elements"); } Console.ReadKey(); }

扩展的属性模式

属性模式现在可以更深入地匹配嵌套属性:

C#
public record Person(string Name, Address Address); public record Address(string Street, string City); var person = new Person("John Doe", new Address("123 Main St", "Anytown")); if (person is { Name: "John Doe", Address: { City: "Anytown" } }) { Console.WriteLine("Found John Doe from Anytown"); }

image.png

编辑
2025-10-02
C#
00

在C#中,异步编程因其能够提升应用程序性能和响应能力而变得越来越流行。asyncawait关键字使得编写异步代码变得更加容易,但如果使用不当,它们也可能引入一些陷阱。一个常见的错误是在循环中使用await,这可能导致性能瓶颈和意外行为。在本文中,我们将探讨为什么应该避免在C#循环中使用await,并讨论一些更高效地处理异步操作的替代方法。

在循环中使用await的问题

顺序执行

当在循环中使用await时,每次迭代都会等待前一次迭代完成后再开始。这导致了顺序执行,抵消了异步编程的好处。请看以下示例:

C#
foreach (var item in items) { await ProcessItemAsync(item); }

在这段代码中,每次迭代都会等待ProcessItemAsync完成后再进行下一次迭代。如果ProcessItemAsync需要较长时间才能完成,这会导致性能不佳。

编辑
2025-10-02
C#
00

ExcelDataReader 是一个轻量级且高效的库,用于读取 .xlsx.xls 文件中的数据。本文将详细介绍如何在 C# 项目中使用 ExcelDataReader 库,并提供多个示例来演示其功能。

前提条件

在开始之前,确保以下环境准备就绪:

  1. .NET (Core 或 Framework)
  2. Visual Studio 或其他兼容的 IDE

安装 ExcelDataReader 库

首先,通过 NuGet 包管理器安装 ExcelDataReader 库。您可以在 NuGet 包管理器控制台中运行下面的命令:

C#
Install-Package ExcelDataReader

此外,还需要安装一个支持读取方式的包:

PowerShell
Install-Package ExcelDataReader.DataSet

image.png

编辑
2025-10-01
C#
00

这个以前基本没用过,突然发现在同事代码中有这个,一了解,这个老早就出了,还是老了,好多东西习惯了,这个其实是C# 7.0就引入了。这个特性可以帮助开发者编写更简洁、更易读的代码。本文将深入探讨discard变量的概念、特点以及在各种场景下的应用。

什么是Discard变量?

Discard变量是一种特殊的只读变量,用下划线(_)表示。它的主要用途是表示我们不关心某个值,可以安全地忽略它。使用discard变量可以避免创建不必要的临时变量,从而使代码更加清晰。

Discard变量的特点

  1. 使用下划线(_)表示
  2. 只读变量,不能被赋值
  3. 可以在同一个作用域内多次使用
  4. 编译器会忽略discard变量,不会为其分配存储空间

使用场景和示例

解构元组

当使用元组时,我们可能只需要其中的部分值。这时,discard变量就派上用场了。

C#
static void Main(string[] args) { var (_, lastName, age) = GetPersonInfo(); Console.WriteLine($"Name: {lastName}, Age: {age}"); } static (string, string, int) GetPersonInfo() { return ("John", "Doe", 30); }