
C#
文章平均质量分 60
C#学习记录
xiaowu080
google:wubingbing080
展开
-
C# 活动窗体截图:基于 Win32 API 的实现
该截图功能类基于BitBltGDI+user32.dlldwmapi.dllgdi32.dll返回窗口边框矩形(不含阴影等视觉扩展),而能获取实际显示区域,确保截图完整。BitBltBitBlt适用场景与限制BitBlt。原创 2025-05-15 16:27:49 · 303 阅读 · 0 评论 -
C#自定义控件-实现了一个支持平移、缩放、双击重置的图像显示控件
图像显示与缩放(支持鼠标滚轮缩放)图像平移(支持鼠标拖拽)视图重置(双击重置)网格背景显示。原创 2025-05-15 15:25:31 · 399 阅读 · 0 评论 -
C# 使用SunnyUI控件 (VS 2019)
C# WinForm 开源控件库原创 2025-05-06 14:09:33 · 418 阅读 · 0 评论 -
C# 使用Windows API实现键盘钩子的类
主窗体需能访问此实例,建议将其存储在公共成员变量中(建议放在Program.cs)类实现(位于keyboard.cs)。:是否允许该按键传递到其他应用。接口,推荐在应用主程序中通过。当按键被拦截时,会触发。原创 2025-04-23 17:39:01 · 313 阅读 · 0 评论 -
C# byte[]字节数组常用的一些操作。
通过整数除法实现向上取整。+ 1:补偿截断的部分,确保结果向上取整。Length = 8→(正确)。Length = 9→(正确)。:直接数学向上取整。8.0强制浮点除法,保留小数部分。对结果向上取整。原创 2025-04-22 11:50:51 · 393 阅读 · 0 评论 -
C#设计模式-状态模式
【代码】C#设计模式-状态模式。原创 2025-04-15 11:47:08 · 322 阅读 · 0 评论 -
C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式
表示(如事件流、实时数据)。,用于注册观察者。表示,响应数据变化。:接收新数据。:处理错误。:响应数据流结束。原创 2025-04-15 11:25:16 · 427 阅读 · 0 评论 -
C#Task.ContinueWith 方法深度解析
Console.WriteLine($"异常: {t.Exception.InnerException.Message}");.ContinueWith(t => Console.WriteLine($"最终结果: {t.Result}"));task.ContinueWith(previousTask => { // 前置任务完成后执行的代码 });task.ContinueWith(t => Console.WriteLine("完成"),if (t.IsFaulted) { /* 处理异常 */ }原创 2025-04-10 11:48:07 · 719 阅读 · 0 评论 -
C# task任务异步编程提高UI的响应性
方式1:async/await模式方式2:回调注册模式。原创 2025-04-10 11:40:02 · 386 阅读 · 0 评论 -
C# 关于 async 中直接调用 .Result死锁的问题
需要返回 UI 线程继续执行,但 UI 线程已经被阻塞,导致互相等待(死锁)。:UI 卡死,因为 WinForms 有同步上下文。等待 UI 线程空闲,而 UI 线程又在等待。不会阻塞 UI 线程,而是让 UI 线程在。期间去处理其他消息(如鼠标移动、按钮点击)。,无法处理其他消息(如界面渲染、用户输入)。,因为控制台程序没有 UI 同步上下文。(但不适用于 UI 更新)。阻塞了 UI 线程,而。在 1 秒后正常更新。原创 2025-04-10 09:03:29 · 449 阅读 · 0 评论 -
C#中获取字节数据的高字节和低字节
在C#中,你可以使用位操作来获取16位或更大数值的高字节和低字节部分。小端序(Little-Endian):低字节在前(x86架构)大端序(Big-Endian):高字节在前(网络字节序)对于32位整数(uint/int)原创 2025-03-25 16:12:21 · 553 阅读 · 0 评论 -
C# 比较两个List集合内容是否相同
在 C# 中,要比较两个List<T>忽略顺序:可以先对两个列表排序后再使用。如果你想比较自定义对象的集合,比如,你需要自定义比较规则。默认情况下,List<T>的比较是基于对象引用的比较(即两个对象的引用是否相同),而不是根据对象的内容来判断。为了比较自定义元素,你需要重写Equals和方法。这样,比较时会依据你定义的规则进行比较。假设你有一个自定义类Person,你想根据Name和Age属性来判断两个Person对象是否相同。顺序和内容都相等:使用。忽略顺序。原创 2025-02-08 14:18:58 · 1156 阅读 · 0 评论 -
C# 向上取整多种实现方法
类型的参数,并返回大于或等于该参数的最小整数(以。方法来实现向上取整。在 C# 中,可以利用。原创 2024-12-05 10:37:09 · 1314 阅读 · 0 评论 -
C#为复杂属性提供下拉式编辑框和弹出式编辑框
弹出式和下拉式是如何实现的呢,这需要为属性提供一个专门的编辑类。.Net为我们提供了一个System.Drawing.Design.UITypeEditor类,它是所有编辑类的基类,从他继承出了诸如ColorEditor、FontEditor的类,因此我们可以在属性框中编辑颜色和字体。定义了这样的类,我们也可以为自己的属性实现弹出式和下拉式编辑方式。 继承者说明:若要实现自定义设计时 UI 类型编辑器,必须执行下列步骤1. 定义一个从 派生的类目的:创建一个新的编辑器类,用于自定义编辑属性值原创 2024-08-23 11:58:24 · 791 阅读 · 0 评论 -
Winform中DataGridView网格添加ComboBox
3 .编写DataGridView的CurrentCellChanged事件和ComBoBox的SelectedIndexChanged事件。1. 在窗体类中声明一个全局的变量ComBoBox,并在Form的Load事件中设置号ComBoBox的下拉选项。2 .在DataGridView绑定完数据源之后,将ComBoBox添加到DataGridView中。原创 2024-08-21 10:21:00 · 490 阅读 · 0 评论 -
C#的DllImport使用方法
我们编写的C#代码(也包括.net平台上的其他语言,如VB,J#等),首先经过编译器把代码编译成中间语言(IL),当方法被调用时,公共语言运行库CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用使用。环境的外部,直接编译成目标计算机码,由操作系统直接执行的代码,代码必须自己提供垃圾回收,类型检查,安全支持等服务。指示入口点的调用约定。非托管代码生成的DLL文件,比如使用C++编写的代码编译生成的DLL,不能在VS中直接引用,可以通过DllImport方法来使用。原创 2024-07-10 12:23:15 · 1277 阅读 · 0 评论 -
C#中JSON格式转换
借助NuGet 程序包添加json库文件,添加引用 using Newtonsoft.Json;原创 2024-06-27 16:07:50 · 949 阅读 · 0 评论 -
C# 一个串口通信的案例实现
Reader:R // 读取失败Reader:R12345678// 读取成功Example:Reader:0A 52 30 31 32 33 34 35 59 54 0D 0A // 成功Reader:0A 52 46 41 49 4C 0D 0A // 失败RPP1R12345678RFAIL。原创 2024-06-18 14:46:42 · 641 阅读 · 1 评论 -
C#中的值类型与引用类型
这些值类型在C#中通常被用来存储简单的数据,它们的实例直接包含其数据的副本,而不是引用到实际数据的地址。在C#中,值类型是一种数据类型,它们直接包含它们的数据,并存储在栈上或内联在其他对象中。与引用类型不同,值类型的实例直接包含其数据的副本,而不是引用到实际数据的地址。在C#中,结构体是一种值类型,它们的实例直接包含其数据的副本,而不是引用到实际数据的地址。这些引用类型在C#中都是通过引用在内存中进行管理的,它们的实例是存储在堆内存中的,并通过引用来访问和操作。:是一种类型安全的函数指针,用于引用方法。原创 2024-06-02 10:37:39 · 676 阅读 · 1 评论 -
C# 字节数组(byte[])拼接的性能对比测试
【代码】C# 字节数组(byte[])拼接的性能对比测试。原创 2024-05-27 09:06:44 · 665 阅读 · 0 评论 -
C# log4net- 使用教程
用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。右击项目新建一个config类型文件,取名为log4net (log4net 的配置信息单独的写在一个config文件里比较好管理,与其他代码分离清楚)Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。3. Log4net的结构。原创 2024-05-17 11:46:07 · 1826 阅读 · 0 评论 -
C# 单例模式及其应用
这样可以确保只有一个缓存管理器实例被创建,所有的数据都可以通过该实例进行缓存和访问,避免了多个缓存实例导致的数据冗余和一致性问题。使用单例模式可以确保只有一个日志记录器实例存在,所有的模块都可以通过该实例将日志信息写入到同一个日志文件中,避免了多个日志实例导致的日志信息分散和不一致的问题。:在应用程序中,可能会有大量的任务需要并发执行,为了提高性能和资源利用率,可以使用单例模式来实现线程池。这样可以确保只有一个线程池实例被创建,所有的任务都可以提交到该实例中进行并发执行,避免了频繁创建和销毁线程的开销。原创 2024-04-28 17:13:31 · 1416 阅读 · 2 评论 -
C# 使MessageBox.Show弹出框保持最前
【代码】C# 使MessageBox.Show弹出框保持最前。原创 2024-04-28 15:24:23 · 3223 阅读 · 0 评论 -
C#虚方法的使用场景
通过使用虚方法,您可以在派生类中重写基类中定义的方法,从而实现不同对象在相同方法调用时表现出不同的行为。您可以在基类中定义一个虚方法来处理控件的绘制逻辑,然后在每个具体的控件派生类中重写该方法以适应特定的绘制需求。您可以创建一个基类来处理数据库连接和一般的数据访问逻辑,然后在具体的数据访问对象派生类中重写虚方法以执行特定的数据库操作。您可以使用虚方法来定义基类中的角色动作,然后在具体的角色类中重写这些方法以实现特定的动作。通过虚方法,您可以实现基类的通用功能,并通过派生类的重写来定制特定类型的行为。原创 2024-04-26 17:31:54 · 695 阅读 · 3 评论 -
C# 打开另一个程序并将其吸附到已经创建好的空窗体中
函数将其窗口句柄(handle)设置为您的窗体的子窗口。要在C#中打开另一个程序并将其吸附到已经创建好的空窗体中,您可以使用。类来启动另一个程序,并使用。原创 2024-04-26 16:36:42 · 563 阅读 · 1 评论 -
C#修改电脑IP信息帮助类
【代码】修改电脑IP信息帮助类。原创 2024-04-25 14:06:21 · 1342 阅读 · 1 评论 -
C# WinForm多线程修改控件,在窗体未创建或关闭时报错
百度之后,发现需要判断控件的IsHandleCreated和IsDisposed等属性,并且如果还有错误,可以再捕获InvalidOperationException异常,避免程序崩溃,每次涉及到UI变动的地方都这么判断的话,则太麻烦。WinForm多线程修改控件时,提示在“创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”报错信息,并且如果没有捕获到,则可能导致程序崩溃,直接关闭。原创 2024-03-27 09:24:00 · 466 阅读 · 0 评论 -
C#实现两台电脑通过UDP通信修改IP
思路:双方定义一个共同的通信端口,调试软件定义为发送端,通过广播的方式发送指令,看门狗定义为接收端,接收发送端发来的命令,为保证数据的完整性我们需要定义一下报文格式,我使用的是CRC16_IBM效验。调试软件与看门狗软件通过UDP通信实现互相身份识别验证,解析指令执行修改本地IP信息,修改完成后双方地址信息都知道了,这样就可以建立TCP通信了。项目要求:实现看门狗软件与外部调试软件在不知道对方信息的状态下建立可靠的通信。CRC效验静态库方法(nuget安装包,搜索“原创 2024-03-25 15:01:06 · 613 阅读 · 0 评论 -
C#定时执行一次任务
项目中有个需求缓存垃圾清理,不想用timer一直刷新读取判断是否执行,我想要在每天定时执行一次任务。原创 2024-03-13 15:47:07 · 1641 阅读 · 1 评论 -
c#闭包问题
而在第二个正确的例子里,在每一次循环中,会创建一个新的临时变量u来保存当前循环的i,当委托或Lambda创建时,闭包这个新的临时变量u,且每个不同委托引用的u是互相独立的,其到委托执行时都是不会变化的,所以使用临时变量来保存匿名函数想要引用的外部函数变量可以解决闭包陷阱。“foreach”的遍历中定义的临时循环变量会被逻辑上限制在循环内,“foreach”的每次循环都会是循环变量的一个拷贝,这样闭包就看起来关闭了(没有了)。在c#中,内层的函数可以引用包含在它外层的函数的变量,即使外层函数的执行已经终止。原创 2024-03-12 13:08:31 · 1291 阅读 · 1 评论 -
C#泛型委托理解(Deleagte与Action、Func用法)
关键字到匿名委托方法,再到Action和Func,Action是无返回值的委托,Func是有返回值的委托,现在基本上都是基于Action和Func来写委托的,有些和业务逻辑连接起来写匿名委托方法。Func(有返回值)------T1和T2为0-16个参数类型,T3为返回值类型。其实C#已经帮我们封装好了泛型委托,无返回值泛型委托Action,有返回值泛型委托Func。Func(有返回值)------T1为0-16个参数类型,T2为返回值类型。//声明泛型委托,有返回值从。原创 2024-03-11 17:25:31 · 1243 阅读 · 1 评论 -
C#后台无窗体程序实现
由于项目要求做一个C#窗体隐藏后台计算程序并唯一,找到两种方法实现后台应用程序,下面讲讲怎么实现。原创 2024-03-11 10:28:09 · 1371 阅读 · 1 评论 -
C# UDP实现远程主机与本地主机两台设备间广播通信
在使用TCP/IP 协议的网络中,主机号为全1的IP地址为广播地址。两者的区别就是,本地广播在不知道目标主机的网络地址下,如果目标主机是在本地网络,可以发送本地广播,本地网络下的所有主机都能接收广播。直接广播是目标主机的网络地址知道,那该网络地址网段下的所有主机都能收到广播,直接广播更精确范围更小些。地址就是255.255.255.255,它不经路由转发,发送本地网络下的所有主机,只能在局域网内转发,主要是不用知道目标主机的掩码与网络地址,本地转发同本地网络下的所有主机。掩码最后为0的位为主机位。原创 2024-03-11 10:15:24 · 1486 阅读 · 1 评论 -
C#程序以管理员权限运行
【代码】C#程序以管理员权限运行。原创 2024-03-07 11:03:55 · 2548 阅读 · 1 评论 -
C# Nuget上一个轻量级TCP\IP通讯库(SimpleTCP)
工作中经常遇到需要实现TCP客户端或服务端的时候,如果每次都自己写会很麻烦且无聊,使用SuperSocket库又太大了。这时候就可以使用。原创 2024-03-06 12:58:59 · 2933 阅读 · 0 评论 -
C# lambda表达式及匿名方法
Console.WriteLine("通过委托调用方法:a+b={0}", a + b);Console.WriteLine($"通过匿名方法:a+b={a + b}");//匿名方法概念:这个方法没有具体名称,只有委托关键字,方法参数,方法体,所以称为匿名方法。匿名方法概念:这个方法没有具体名称,只有委托关键字,方法参数,方法体,所以称为匿名方法。//通过Lambda表达式,Lambda表达式就是将匿名方法进一步封装,Lambda表达式:就是将匿名方法进一步封装,基本定义规范:(参数)=>{方法体}原创 2024-03-05 14:09:54 · 441 阅读 · 0 评论