![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#
文章平均质量分 66
lijingguang
这个作者很懒,什么都没留下…
展开
-
.NET 一些常用的类型转换扩展
// 将object转换为demical,若转换失败,则返回指定值。/// 将object转换为double,若转换失败,则返回指定值。/// 将object转换为demical,若转换失败,则返回0。/// 将object转换为long,若转换失败,则返回指定值。/// 将object转换为bool,若转换失败,则返回指定值。/// 将object转换为long,若转换失败,则返回0。/// 将object转换为int,若转换失败,则返回指定值。/// 删除最后结尾的指定字符后的字符。原创 2024-06-21 14:00:30 · 372 阅读 · 0 评论 -
要使 WinForms(Windows Forms)应用程序识别高 DPI 分辨率并正确缩放显示元素
要使 WinForms(Windows Forms)应用程序识别高 DPI 分辨率并正确缩放显示元素,可以通过配置应用程序清单文件和应用程序配置文件来实现。通常,WinForms 应用程序会自动处理大多数 DPI 变化,但在某些情况下,您可能需要手动调整控件大小和字体。通过以上配置和代码设置,您的 WinForms 应用程序将能够识别和处理高 DPI 分辨率,从而在高分辨率显示器上正确缩放和显示用户界面元素。1. 如果项目中没有 `app.config` 文件,请添加一个。原创 2024-06-14 17:18:11 · 485 阅读 · 0 评论 -
winform 应用程序 添加 wpf控件后影响窗体DPI改变
第二步:把这段配置 注释放开,第一个配置true 改成false。第一步:添加 应用程序清单文件 app.manifest。原创 2024-06-14 14:48:55 · 383 阅读 · 0 评论 -
使用C#创建安装Windows服务程序(干货)
Windows服务是在Windows操作系统上,以后台形式运行的应用程序。它们可以在系统启动时自动启动,并且独立于用户登录。Windows服务通常用于执行那些长时间运行、无需用户交互或需要在后台持续执行的任务。原创 2024-06-07 14:00:51 · 630 阅读 · 0 评论 -
C# - 委托与事件
委托是C#中的一种类型,用于存储对方法的引用。它允许将方法作为参数传递给其他方法,实现回调、事件处理和动态调用等功能。通俗来讲,就是委托包含方法的内存地址,方法匹配与委托相同的签名,因此通过使用正确的参数类型来调用方法。原创 2024-06-06 11:10:28 · 387 阅读 · 0 评论 -
vsto Excel插件模拟撤销恢复
/ 一旦有新的操作,恢复栈应该清空。/// 设计器支持所需的方法 - 不要修改。// 创建相应的恢复操作。/// 使用代码编辑器修改此方法的内容。#region VSTO 生成的代码。// 将撤销操作添加到栈中。// 绑定工作簿变化事件。// 捕捉单元格变化。原创 2024-06-05 14:24:29 · 433 阅读 · 0 评论 -
使用Visual Studio 分析.NET Dump
内存泄漏和高CPU使用率是在日常开发中经常遇到的问题,它们可能会导致应用程序性能下降甚至崩溃。今天我们来讲讲如何使用Visual Studio 2022分析.NET Dump,快速找到程序内存泄漏问题。Dump文件又叫内存转储文件或者叫内存快照文件。用于存储程序运行时的状态信息的文件,这些文件通常包含了程序运行时的内存内容、线程信息、堆栈调用信息、异常信息等数据。Dump文件可以在程序崩溃、失去响应、资源消耗过高或者性能不理想等情况下生成,以帮助开发人员进行故障排查和调试。原创 2024-06-05 10:23:11 · 423 阅读 · 0 评论 -
C# 工厂模式学习
接口:定义了一组必须实现的方法和属性,没有实现代码。支持多重继承,使得类可以实现多个接口。继承:用于从现有类创建新类,继承基类的成员。每个类只能有一个基类,但可以实现多个接口。结合使用:通过将接口和继承结合使用,可以实现代码的高复用性和灵活性。通过上述示例,可以看到如何使用接口和继承来设计灵活且可扩展的应用程序结构。这样既能充分利用基类的通用功能,又能通过接口实现特定的行为。原创 2024-05-31 11:13:39 · 1171 阅读 · 0 评论 -
获取 Excel 单元格的条件格式是否成立及其改变后的属性(如背景颜色)
获取 Excel 单元格的条件格式是否成立及其改变后的属性(如背景颜色),直接通过 VSTO API 是有挑战的,因为条件格式的实际应用效果在 Excel 的内部逻辑中,并不直接暴露给外部 API。尽管如此,可以通过一些工作方式来判断条件格式的成立,并获取单元格的最终显示效果。以下是一个更直接的方法来获取条件格式应用后的背景色。这个方法依赖于 Excel 的显示属性,而不是条件格式的定义。原创 2024-05-29 14:17:29 · 490 阅读 · 0 评论 -
C# 异步和线程的区别
然而,如果你需要更多的控制(如线程优先级、线程池管理等),那么可能需要使用线程。异步操作不会创建新的线程,它们依赖于异步框架(如基于事件的异步模式(EAP)、基于任务的异步模式(TAP)、异步流(IAsyncEnumerable)和异步任务(Task、ValueTask)等)来管理执行流。与此不同,线程处理是更底层的概念,它允许你创建和管理独立执行的线程。每个线程有自己的调用栈和上下文,可以执行独立的任务。线程由操作系统管理,你可以在程序中创建和销毁线程,并能对其进行操作(如暂停、继续、优先级设置等)。原创 2024-03-26 11:00:56 · 352 阅读 · 0 评论 -
一个操作让数组处理速度快了5倍,到底是为什么
这就意味着在主循环中,对数组的访问会更加连续,这有助于提高缓存的命中率(cache hit rate)。在主循环中,对data数组的访问是顺序的,即按照数组元素的顺序依次访问。在没有排序的情况下,由于数组的内存布局是随机的,这可能导致对内存的随机访问,而这种随机访问可能导致较多的缓存缺失(cache misses)。通过对数组进行排序,代码更好地利用了缓存,从而提高了程序的性能。今天做一个数组数据计算时,发现一个效率问题,给大家分享一下 一个数组排序和不排序时同样的逻辑处理速度是不一样的。原创 2024-03-25 10:05:05 · 331 阅读 · 0 评论 -
浅谈WPF之MVVM工具包
点击项目右键,选择“管理NuGet程序包”,打开NuGet管理窗口,然后搜索“CommunityToolkit.Mvvm”,进行安装即可,目前最新版本为8.2.2。在之前的WPF示例中,都会用到一个MVVM框,也是一个比较常的MVVM框架,就是MVVM工具包【CommunityToolkit.Mvvm】,今天专门以一个简单的小例子,简述一下MVVM工具包的常见用法,仅供学习分享使用,如有不足之处,还请指正。在本实例中,只是简单介绍了MVVM工具包的使用,如若想具体了解更详细内容,可参考官方文档,原创 2024-03-25 09:39:44 · 1386 阅读 · 0 评论 -
设计模式:面向对象设计的六大原则
很久没有写博客了,一直给自己找借口说太忙了,过几天有空再写,几天之后又几天,时间就这么快速的消逝。说到底就是自己太懒了,不下点决心真是不行。我决定逼自己一把,从今天开始学习设计模式系列,并写成博文记录下来,做不到的话,就罚自己一个月不玩游戏 (作孽啊。。。。好了,面向对象的六大原则就介绍到这里了。其实,我们不难发现,六大原则虽说是原则,但它们并不是强制性的,更多的是建议。原创 2024-03-22 11:07:36 · 1375 阅读 · 0 评论 -
WinForm使用Costura.Fody打包编译成可独立运行的桌面程序
5.接着,清理一下,然后重新生成,再看看输出文件夹里,是否减少了dll依赖文件,一个可执行的桌面程序绿色版本就这样弄出来了,无需安装,直接运行,方便分享程序给他人使用。7.再把复制到的一些文件,设置包括到项目中,然后修改属性生成操作为嵌入的资源。最后,确定一下是否会打包编译成可独立运行的桌面程序,打开项目里的目录。如果没有看到FodyWeavers.xml文件,那就自己手动添加。,根据你编译的运行环境选择,把生成的依赖文件复制那文件夹里面。下看看,如下图所示,所有依赖的。都打包在一个exe可执行程序里。原创 2024-03-22 10:11:26 · 664 阅读 · 0 评论 -
Csharp学习Linq
这里就串联上了我们之前学到的知识,最后为了支持多种数据类型,使用上泛型,最后我们就得到了最终封装的方法.这里继续使用之前文章创建的学生类,首先简单介绍一下linq的使用。这里还可以使用扩展方法和lambda表达式进一步的优化我们的代码。这个就是一个yield return反汇编出来的状态机的代码。大量的重复代码---最好是封装一些,把重复的代码统一封装;下面写几个简单的linq的语句,大概知道一下它的使用.封装一个方法,将判断的逻辑独立到一个小方法中去.看起来跟我们自己实现的Where差不多的样子.原创 2024-03-22 10:00:59 · 252 阅读 · 0 评论 -
每个.NET开发都应掌握C#泛型的知识点
C#泛型编程是.NET framework 2.0的新特征,它提高了代码安全性和代码重用的问题。C#泛型编程在C#是很重要的特性,建议.NET开发熟练掌握它的基本知识点,本文将介绍它的几个知识点,供大家参考。C# 4.0引入了接口的协变和逆变,使得泛型类型参数可以在接口中进行协变(`out`)或逆变(`in`)。泛型约束允许限制泛型参数的类型,以增加类型安全性和代码约束。泛型类型和方法允许在定义时不指定具体的类型,而是在使用时确定类型。泛型类可以继承其他泛型类或非泛型类,也可以实现泛型或非泛型接口。原创 2024-03-21 10:54:09 · 236 阅读 · 0 评论 -
C# 继承、多态性、抽象和接口详解:从入门到精通
在 中,可以将字段和方法从一个类继承到另一个类。我们将“继承概念”分为两类:要从一个类继承,使用 : 符号。在以下示例中, 类(子类)继承了 类(父类)的字段和方法:示例原创 2024-03-21 09:00:00 · 991 阅读 · 0 评论 -
C#基于SMTP的邮件发送
创建一个发送邮件的方法,首先创建一个SmtpClient对象、发件人地址对象、收件人地址对象和MailMessage对象,这里在创建SMTP对象的时候需要放入服务器地址作为参数、创建收发件人对象的时候需要输入邮箱地址、姓名和Encoding.UTF8作为参数,最后在创建MailMessage对象的时候需要把from和to作为参数传入,如图2-2所示;这里我们可以看到提示中有服务器地址,我们开启的是SMTP服务,如图1-5所示,SMTP服务器的地址是:smtp.163.com;原创 2024-03-20 16:24:02 · 880 阅读 · 1 评论 -
C#多线程精解:优雅终止线程的实用方法与技巧
在C#多线程编程中,合理终止线程是关键挑战。通过标志位或CancellationToken,实现安全、协作式的线程终止,确保在适当时机终止线程而避免资源泄漏。原创 2024-03-20 10:29:19 · 1237 阅读 · 0 评论 -
探索.NET中的定时器:选择最适合你的应用场景
NET提供多种定时器,如System.Windows.Forms.Timer适用于UI,System.Web.UI.Timer用于Web,System.Diagnostics.Timer用于性能监控,System.Threading.Timer和System.Timers.Timer用于一般定时任务。在.NET 6及以上,还有更直观的System.Threading.PeriodicTimer。选择合适的定时器,提升应用性能和用户体验。今天看到一网友聊.net中的定时器,我也把我知道和大家分享一下。原创 2024-03-20 10:04:04 · 602 阅读 · 0 评论 -
什么是委托,委托的本质是什么?
跟方法有点类似,有参数,返回值,访问修饰符+delegate --委托--特殊的方法?委托的本质是什么?是方法吗?反编译试试:发现定义的委托-----再CustomDelegate ----有对应的class委托的本质是什么?---Class(类),继承自一个MulticastDelegate的特殊类,自己在定义类的时候,是无法继承的。包含的有构造函数和方法。委托既然是一个类---怎么使用这个类?new ---调用方法/属性");x = 100;");x = 100;原创 2024-03-19 16:10:34 · 497 阅读 · 0 评论 -
CSharp的lambda表达式匿名类扩展方法
C#是强类型语言(编译时决定类型),object是在编译时确定类型,因为Object没有Id等属性,所以无法通过.去访问其中的变量.本质上来说,其实就是一个方法--匿名方法, 在类里面会生成和lambad 表达式参数和返回值完全匹配的方法.关键字去避开了编译器的检查,会在运行时检查,运行时决定类型.这个出现乱取的问题,导致程序崩溃.注意:扩展object类型.期望:既可以增加新的功能,历史代码不变.直接增加类,在新的类中去完成.有什么方法可以正确的取出想访问的属性,又可以避免访问不存在的属性那?原创 2024-03-19 15:28:12 · 721 阅读 · 0 评论 -
搞懂.NET应用程序管理员权限:三种简单方法一网打尽
NET应用程序以管理员身份运行的方法包括修改清单文件、项目文件,或在运行时动态请求管理员权限。清单文件和项目文件通过声明UAC请求,而动态请求管理员权限则在程序启动时检查并重新启动。选择适当的方法取决于项目需求和配置。在.NET应用程序中强制以管理员身份运行,可以通过清单文件、项目文件或者在程序运行时动态请求管理员权限。原创 2024-03-19 09:47:03 · 566 阅读 · 0 评论 -
掌握C#中的GUI多线程技巧:WinForms和WPF实例详解
本指南详细解释了在C#中如何在创建控件的线程以外的线程中访问GUI。基础功能使用`Control.Invoke`(WinForms)或`Dispatcher.Invoke`(WPF),高级功能则利用`SynchronizationContext`实现线程间通信,确保代码清晰可读。在C#中,要在创建控件的线程以外的线程访问控件,可以使用Control.Invoke(WinForms)或Dispatcher.Invoke(WPF)。以下是详细的步骤和示例代码,包括基础功能和高级功能。原创 2024-03-19 09:35:48 · 803 阅读 · 0 评论 -
JWT(跨域身份验证解决方案)
同时服务器保存的用户信息会生成一个sessionid(相当于用户信息是一个value值, 而sessionid是value值的key)返回给客户端, 客户端将sessionid保存到cookie中,当用户再次访问服务器时,会携带sessionid,服务器会拿着sessionid从服务器获取session数据,然后进行用户信息查询,查询到,就会将查询到的用户信息返回,从而实现状态保持。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。原创 2024-03-18 16:56:13 · 1061 阅读 · 0 评论 -
C#、ASP、ASP.NET、.NET、ASP.NET CORE区别、ASP.NET Core其概念和特点、ASP.NET Core个人心得体会
总的来说,ASP.NET Core是一种卓越的Web应用程序框架,具备出色的性能、丰富的功能和跨平台支持。ASP.NET Core是.NET平台上的新一代Web应用程序开发框架,它是ASP.NET的升级版本。.NET是微软开发的一个跨平台的应用框架,它提供了统一的编程模型和库,可用于开发各种类型的应用程序。总的来说,ASP.NET Core 具有跨平台、高性能、可扩展性、轻量级、内置安全机制、高度可测试性、多种开发模型、开源等特点,使得开发人员可以更加高效、安全、可靠地开发 Web 应用程序。原创 2024-03-18 10:13:13 · 840 阅读 · 0 评论 -
优化代码性能:C#中轻松测量执行时间
首先,定义一个 Action,包含你要测量执行时间的代码块。// 模拟代码执行时间较长的情况。原创 2024-03-13 14:32:36 · 443 阅读 · 0 评论 -
深度复制:C# 中 List 与 List 多层嵌套不改变原值的实现方法
以上内容详细介绍了在 C# 中实现不改变原 List 值的多层嵌套复制方法,包括使用 AutoMapper、Json.NET、以及对象序列化的步骤和示例。这些方法提供了灵活而高效的方式,可以根据项目需求选择最适合的深度复制方式。原创 2024-03-13 11:43:58 · 575 阅读 · 0 评论 -
C# 的一些好用的语法糖介绍
C# 中有很多语法糖(Syntactic sugar),它们是一些语言特性,使得编写代码更加简洁、易读、更具表现力。允许基本数据类型表示为可空的,用于表示可能为 null 的值。允许在字符串中直接插入表达式,更加方便地构建字符串。允许你在不修改原始类的情况下向现有类添加方法。可以在调用方法时指定参数的名称,增加了可读性。确保资源在使用完后被释放,使得代码更加健壮。允许你初始化集合类型,使得代码更加清晰。// 使用 myObj。允许你在编译时动态地访问属性和方法。// 使用 myObj。原创 2024-03-06 10:58:23 · 942 阅读 · 0 评论 -
C#解析JSON
string jsonText = "{\"name\":\"网站\",\"num\":2,\"sites\":[{\"name\":\"Google\",\"info\":[\"Android\",\"Google搜索\",\"Google翻译\"]},{\"name\":\"Taobao\",\"info\":[\"淘宝\",\"网购\"]}]}";string jsonText = "{\"allname\":{\"name\":\"张三\",\"name_en\":\"zhangsan\"}}";原创 2024-03-01 14:06:52 · 2216 阅读 · 0 评论 -
c# 类的介绍及延伸
C#字段相当于c++的成员变量,属性是一个类中的变量属性,可以在函数中访问和使用。如果一个类实现了多个接口,并且其中一些接口有相同签名和返回类型的成员,那么类可以实现单个成员来满足所有包含重复成员的接口。5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。可以给属性的get和set设置不同的访问修饰符,但get和set必须有一个采用属性的访问级别。接口可以从一个或多个接口继承,因此接口包含它继承的所有接口和所有基接口的成员。原创 2024-02-27 15:19:50 · 985 阅读 · 0 评论 -
c# 类的介绍及延伸
这种构造函数整个程序运行期间只执行一次,类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。C#字段相当于c++的成员变量,属性是一个类中的变量属性,可以在函数中访问和使用。实现类中的显示接口成员实现只可以通过指向接口的引用来访问。如果一个类实现了多个接口,并且其中一些接口有相同签名和返回类型的成员,那么类可以实现单个成员来满足所有包含重复成员的接口。5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。原创 2024-02-26 10:08:23 · 883 阅读 · 0 评论 -
C# | 使用AutoResetEvent和ManualResetEvent进行线程同步和通信
与 AutoResetEvent 不同的是,ManualResetEvent 在设置为终止状态后,会一直保持终止状态,直到调用 Reset() 方法将其重置为非终止状态。当另一个线程调用 Set() 方法将事件设置为终止状态时,等待的线程将被唤醒,并且事件将自动重置为非终止状态。重置行为:AutoResetEvent 在一个等待线程被唤醒后会自动将事件重置为非终止状态,而 ManualResetEvent 则需要显式地调用 Reset() 方法将事件重置为非终止状态。// 唤醒所有等待线程。原创 2024-02-19 10:42:19 · 972 阅读 · 0 评论 -
VSTO打包Word插件WPS也支持
以上是基本的打包操作,如果要更多的比如图标等功能请自己摸索。六、选择要打包的项目debug文件夹。四、输入自已的插件名和公司名。五、选择包的保存位置。原创 2024-02-06 09:48:47 · 1794 阅读 · 0 评论 -
C# 设计原则有哪些优缺点
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。迪米特法则其根本思想,是强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成影响,也就是说,信息的隐藏促进了软件的复用。3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。原创 2024-02-05 10:26:38 · 500 阅读 · 0 评论 -
C#面向对象程序设计
2.抽象类不能是密封或者静态的:如果给抽象类增加密封类的访问修饰符sealed或者static,系统会提示错误,其实很容易理解,抽象类如果不被子类继承并实现它的抽象方法,便没有实际意义。继承模拟了现实世界的关系,继承实现了代码的重用,继承使得程序结构清晰,子类和父类的层次结构清晰,最终的目的是使子类只关注子类的相关行为和状态,无须关注父类的行为与状态。抽象方法必须在其子类中实现,除非它的子类也是抽象类。由于无法创建抽象类的实例对象,所以只能通过它的子类来实现该类的方法,除非它的子类也是一个抽象类。原创 2024-02-04 15:54:02 · 1133 阅读 · 0 评论 -
C# 面向对象(OOP)编程关键知识点
C#语言是2001年,微软推出".Net战略"时,专门订制的一门编程语言,其基本的思想就是仿照JAVA语言的虚拟机原理,开发出“受托管”的中间语言。C#的OOP(面向对象)编程是C#编程语言中最为精华的部分,如果没有学习C#的OOP部分,则可以认为就没有学习过C#。在继承关系的类中,父类中定义了“虚方法”(关键字:Virtual),子类使用关键字override 进行方法重写。目的是:为了一个项目中,可以使用重名的类。private: 私有的,只能本类访问,包括子类也不能访问,是最严格的控制访问。原创 2024-02-04 15:25:39 · 1015 阅读 · 0 评论 -
在C#中如何避免内存泄漏
在C#中避免内存泄漏的关键是有效地管理对象的生命周期,确保不再需要的对象能够被垃圾回收器正确地释放。以下是一些在C#中避免内存泄漏的常见做法原创 2024-02-02 15:16:59 · 745 阅读 · 0 评论 -
线程启动停止暂停
get {set}));//启动ThMethod();while(!Current++;//停止//暂停mr.Reset();//继续mr.Set();原创 2024-01-27 15:22:35 · 378 阅读 · 0 评论 -
C# LING查询语法学习,扩展方法的使用
/ Student obj3 = new Student() { StuId = 1012, Age = 25, StuName = "学员12" };// Student obj5 = new Student() { StuId = 1019, Age = 27, StuName = "学员19" };// "杜丽", "马俊才", "那英", "成龙","王丽", "杜宇","马晓","刘丽","马大哈",};原创 2024-01-27 14:28:40 · 602 阅读 · 0 评论