2025-10-01
C#
00

在C#中,结构(struct)是一种将各种数据类型的变量组合在一起的值类型。尽管它们与类(class)非常相似,都是用户定义的数据类型,可以存储大量不同的数据类型,但结构是值类型,而类是引用类型。用户可以根据需要定义结构,因此它也被称为用户定义的数据类型。

定义结构

在C#中使用struct关键字来定义结构。一个结构可以包含构造函数、常量、字段、方法、属性、索引器、事件等元素。

语法

C#
struct MyStruct { public int MyField; public void MyMethod() { // 方法体 } }

示例

C#
struct Book { public string Title; public string Author; public int Pages; public Book(string title, string author, int pages) { Title = title; Author = author; Pages = pages; } public void DisplayInfo() { Console.WriteLine($"Title: {Title}, Author: {Author}, Pages: {Pages}"); } }

结构中的构造函数

结构不能有无参数的构造函数。它只能有静态构造函数或参数化构造函数。

示例

C#
struct Point { public int X; public int Y; public Point(int x, int y) { X = x; Y = y; } }

结构中的方法和属性

与类类似,结构可以有方法、自动实现的属性和其他属性。

示例

C#
struct Rectangle { public int Width { get; set; } public int Height { get; set; } public int Area() { return Width * Height; } }

结构中的静态构造函数

结构可以包含静态方法。

示例

C#
struct Counter { public static int Count; static Counter() { Count = 0; } public void Increment() { Count++; } }

结构中的事件

结构可以包含事件,以通知订阅者某个动作的发生。

示例

C#
struct Timer { public event EventHandler Tick; public void OnTick() { if (Tick != null) { Tick(this, EventArgs.Empty); } } }

复制结构

在C#中,可以使用“=”(赋值)运算符将一个结构对象复制到另一个结构对象。

示例

C#
struct Person { public string Name; public int Age; } Person person1 = new Person { Name = "Alice", Age = 30 }; Person person2 = person1;

总结

  • 结构元素包括构造函数、常量、字段、方法、属性、索引器、运算符、事件、嵌套类型等。
  • 结构不能包含无参数构造函数或析构函数。
  • 与类类似,结构可以实现接口。
  • 结构不能作为其他类的基础,也不能继承其他结构。
  • 结构成员不能被指定为抽象、密封、虚拟或受保护。
2025-10-01
C#
00

随着现代显示器分辨率的多样化,以及高DPI(每英寸像素数)屏幕的普及,特别是不少机器调整了百分比显示,创建一个自适应的WinForms界面变得尤为重要。本文将详细介绍在WinForms中如何开发自适应界面,使应用程序在不同分辨率和缩放比例下表现一致。

简介

在Windows应用程序中,显示设置可以影响应用程序的外观。WinForms提供了一些机制来帮助开发者打造自适应界面,但这需要一些配置。本文将带你一步一步实现这一过程。

自动缩放基础

Windows通过DPI(每英寸点数)和应用缩放比例(例如150%或200%)来处理不同分辨率显示器的内容渲染。WinForms提供了一些属性和方法来支持这些缩放设置。主要的概念有:

  • AutoScaleMode:自动缩放模式,定义了控件将如何适应不同的DPI设置。
  • AutoScaleDimensions:设计时间的基DPI。
  • CurrentAutoScaleDimensions:运行时的DPI。
2025-09-30
C#
00

本文将介绍如何使用 C# 和 OpenXml SDK,从 Excel 文件中提取图片和嵌入对象。我们将以一个包含代码示例的完整项目为例,详细介绍实现过程。

准备工作

你需要安装以下 NuGet 包:

  • DocumentFormat.OpenXml

你可以通过 NuGet 安装这些依赖包。在 Visual Studio 的“工具” -> “NuGet 包管理器” -> “包管理器控制台”中运行以下命令:

Bash
Install-Package DocumentFormat.OpenXml

代码结构

本文将从以下几个方面展开:

  1. 打开 Excel 文件
  2. 提取 OLE 嵌入对象
  3. 提取图片
  4. 辅助方法和工具函数

打开 Excel 文件

我们首先需要打开 Excel 文件并遍历其工作表部分,为后续的提取操作做准备。

待读出的excel文件

image.png

2025-09-30
C#
00

领域驱动设计(DDD, Domain-Driven Design)是一种软件设计方法,旨在通过以领域为中心的方式建模,以应对复杂性并提高软件的灵活性和可维护性。DDD鼓励开发人员与领域专家密切合作,构建出能够反映业务需求的模型。它不仅仅是一个技术方法,更是一种开发哲学。

DDD的核心概念

在DDD中,有一些关键概念是核心组成部分:

  1. 领域(Domain): 系统的业务逻辑部分,定义了业务规则和行为。
  2. 实体(Entity): 有唯一标识的对象。
  3. 值对象(Value Object): 不可变且没有唯一标识的对象。
  4. 领域服务(Domain Service): 操作复杂但不归属于任何实体或值对象的业务逻辑。
  5. 聚合(Aggregate): 由实体和值对象组成的集合,并以根实体(Aggregate Root)为入口。
  6. 仓储(Repository): 用于持久化实体的存储机制。
  7. 工厂(Factory): 用于创建复杂对象和聚合根的对象。

一个简单的示例

为了说明DDD的特点,我们将通过一个简单的库存管理系统的控制台应用程序来展示DDD的应用。此示例包含了领域、实体、值对象、领域服务、聚合、仓储和工厂等概念。

项目结构

一个简单的库存管理

C#
- InventoryManagement - Domain - Entities - Product.cs - ValueObjects - ProductId.cs - Services - InventoryService.cs - Factories - ProductFactory.cs - Repositories - IProductRepository.cs - Infrastructure - Repositories - InMemoryProductRepository.cs - Program.cs
2025-09-30
C#
00

在项目管理的世界里,甘特图是不可或缺的工具。它不仅能帮助你直观地展示项目进度,还能有效地管理任务和资源。然而,找到一个既强大又易用的甘特图控件并不容易。今天,我们为你推荐一款颠覆性的工具——.NET C# Winforms Gantt Chart 控件,它将彻底改变你的项目管理方式!

先看个样式

image.png

官网

C#
https://github.com/jakesee/ganttchart

为什么选择.NET C# Winforms Gantt Chart 控件?

1. 无需额外依赖,轻松上手

这款控件完全基于.NET Framework,无需任何额外的预先条件。只需下载最新的源代码并在Microsoft Visual Studio 2017中构建库,你就可以立即开始使用。

2. 强大的功能,满足多样需求

.NET C# Winforms Gantt Chart 控件支持多种时间单位(周、天、小时),并且可以自定义其他时间分辨率。它还提供了单任务、分组任务、前置/后置任务、拆分任务和标记资源等功能。此外,每个任务都有完成百分比属性,帮助你更好地跟踪进度。

3. 灵活的用户界面定制

通过各种鼠标事件,你可以直接在甘特图上自定义用户界面体验。默认的鼠标命令可以通过继承来覆盖,满足你的个性化需求。

4. 打印支持,完美呈现

打印功能尊重页面边距、方向和每页的多个页面设置,确保你的甘特图在纸质版上也能完美呈现。

5. 关键路径和浮动时间计算

控件能够自动确定关键路径和浮动时间,帮助你更好地进行项目规划和风险管理。