C#语言详解
文章平均质量分 69
郝伟博士
郝伟,男,留日计算机博士,副研究员,硕士生导师。师从东京大学松崎公纪教授,主要研究方向为网络安全、并行计算与大数据,尤其是在网络环境下大数据安全性的研究。北京华云安信息技术有限公司首席研究员,中新网安技术研究员,上海莱镁晟信息科技有限公司技术顾问。参与国家973项目和国家科技重大专项各1项,主持国家科研项目1项,13项国家发明专利,各类论文25篇,合肥市政认定高层次人才。与清华大学、海克斯康、国防科技大学等多家单位有技术合作。
展开
-
深度理解 C# 中的 for 和 foreach
很多人认为,在C#中 `for` 和 `foreach` 功能是一样的,`foreach` 顶多就是比 `for` 要更方便一些。但是实际上真的是这样吗?在本文中,让我们通过一个实例来理解其底层的工作原理。原创 2022-06-15 15:50:30 · 5402 阅读 · 2 评论 -
使用TaskFactory类实现MapReduce功能
在多线程编程中,MapReduce是最为常用的一种模型。在C#中有TaskFactory类,可以实现此功能。本文就通过一个实例,介绍具体的工作原理。同时,还引入了CancellationTokenSource类,用于中止整个MapReduce任务。原创 2022-05-07 08:34:51 · 871 阅读 · 0 评论 -
C#8.0中System.Index和System.Range的本质论
对数组或集合的引用都要使用索引,为了进一步规范对索引的使用,从C#8.0开始,提供了两个新的只读结构体 `System.Index` 和 `System.Range`,本文从本质上介绍这两个类的具体内容和原理。原创 2022-05-03 17:48:46 · 1100 阅读 · 0 评论 -
在 Linux(Ubuntu 18)下运行 .NET 6 程序
从.Net core 开始,微软就实现了.Net的跨平台能力。在本文中,笔者使用Ubuntu 18.04.6 LTS上运行一个测试项目,以演示Linux下.Net6.0 的编译方法。原创 2022-02-23 06:36:47 · 6070 阅读 · 1 评论 -
【给力】.Net5.0 跨平台的计算性能已经与Java持平
本文对.Net5.0和Java在Macbook M1 Pro上进行性能测试,发现两者性能几乎相同。原创 2022-02-10 23:00:45 · 666 阅读 · 0 评论 -
首次运行.Net6.0程序注意事项
前言转眼.Net6.0已经发布,对应的开发平台VS2022和C#10都相继发布。首先运行程序时遇到了一些问题,记录不上下来,以便经验备忘。错误在编写了HelloWorld程序后,在没有安装.Net6的机器上运行则会报错,如下图所示。解决首先访问以下地址:https://dotnet.microsoft.com/download/dotnet/6.0/runtime?utm_source=getdotnetcore&utm_medium=referral打开后如图所示。特别注意,现原创 2021-11-24 15:01:38 · 4467 阅读 · 0 评论 -
在C#中将Base64编码的WOFF字符串转OTF字体并动态加载
文章目录项目需求第1步 Base64 转 二进制字节第2步:WOFF 格式转 OTF第3步:动态加载字体小结项目需求在某项目中有这样后个需求:有些字体使用了内嵌的Base64格式表示,如下所示:d09GRgABAAAAAEDwAA0AAAAAW7QAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABMAAAAGAAAABgE1VYZWNtYXAAAAGQAAAArgAABGYx/DcfY3Z0IAAAAkAAAAZEAAAH2v4w3vBmcGdtAAAIhAAAA6IA原创 2021-08-16 09:02:04 · 44140 阅读 · 0 评论 -
在C#中使用嵌入的资源
前言在一些应用场合,我们希望将一些资源嵌入到程序中,然后在使用的时候再提取出来写到本地文件中,本文就介绍其主要实现方法。主要步骤具体过程共有三包,分别是添加文件、设置属性和写入本地文件。第1步:添加文件这将就是直接在VS的项目管理器,将需要添加的资源文件添加到项目中即可。本文使用了一个名为 “template.xlsx” 的Excel模板。第2步:设置属性这里我们需要设置一个重要的属性:生成操作,将其设置为“嵌入的资源”即可,如下所示。第3步:添加写到本地的代码这步就是最终的目标,即将程原创 2021-03-24 07:21:48 · 3532 阅读 · 0 评论 -
在Ubuntu18.04上运行.NET 5.0 之 Hello World
本文记录了在Ubuntu下安装和配置.Net 5.0 的整个过程和相关细节。对初次部署环境的用户有极大的帮助作用。原创 2020-12-03 13:03:39 · 2722 阅读 · 1 评论 -
在C#中使用正则表达式提取括号中的内容
问题给定字符串 "OUTPUT/FA(CIR1),TA(POS1__X),TA(POS1__Y),TA(POS1__Z),TA(POS1__D)" 现在需要取得括号中的内容,如 CIR1、POS1__X、POS1__Y 和POS1__Z,如果我们使用字符串操作,肯定是可以取得,但是如果类似的操作比较频繁,我们完全可以使用正则表达式来完成。正则模式定义假定括号中的内容是数字、字母和下划线,那么我们可以使用以下字符来定义:[0-9a-zA-Z_]+ 或者可以直接使用简化符号/w,变为 \w+。因为我们要原创 2020-10-24 10:05:44 · 16883 阅读 · 0 评论 -
WPF中ComboBox的一个坑
下午在使用WPF的时候发现了一个坑,导致浪费了1个小时的时间,具体内容为:在ComboBox下拉框选择时,SelectedItem.ToString()的内容和 Text是不一样的!,前者为新值,而后者仍为旧值。举例来说,现在有控件 ComboBox cb,其内容为“男”和“女”,当前选择内容为“男”。如果在用户将其重新设置为“女”,那么会触发 SelectionChanged 事件中,那么:cb.Text 的内容为:男cb.SelectedItem.ToString() 的内容为:女也就是说原创 2020-09-24 15:42:00 · 1327 阅读 · 0 评论 -
使用C#显示SVG动画
简介SVG是现在越来越多开发人员开始使用的一种矢量图格式,不仅体积小,而且使用游览器直接就可以打开,而且快捷方便。但是使用C#开发,默认的WebBrower并不支持SVG,而调用COM的IE浏览器同样有问题。所以我们使用了第三方的Chorme浏览器来实现。实现办法首先需要通过NuGet程序包安装Chrome的核心模块CefSharp,其安装的过程参见《C# WINFORM嵌入CHROME浏览器(CEFSHARP)》。安装有几点注意事项:CefSharp的使用.NET Framework 4.5.原创 2020-09-24 11:54:02 · 2896 阅读 · 0 评论 -
单日志管理线程实现每秒百万级日志写入机制设计与实现
Logs.Length = 1048576 x 10logs[0].Length = 60Init: 530.61msSave: 7714.36ms130万条 60字节长度数据写入,文件大小 :620MBLogs.Length = 1048576 x 10logs[0].Length = 100Init: 527.56msSave: 9394.87ms106万条 1000字节长度...原创 2020-08-27 15:43:52 · 915 阅读 · 0 评论 -
一个对文本信息统计的熵增验证程序
文章目录简介熵的数学定义验证原理结论附:源代码简介熵增定律是基于第二热力学定律的著名定律,描述了任何一个系统,包括宇宙本身的熵都是不断增加的定律。本文通过对TXT格式的文章进行测试,以验证为熵增定律。熵的数学定义给定一离散分布变量XXX,其可能值为 x1,x2,...,xnx_1, x_2, ..., x_nx1,x2,...,xn,每个值出现的对应概率为P(x1),P(x2),...,P(xi)P(x_1), P(x_2), ..., P(x_i)P(x1),P(x2),...,P(xi原创 2020-08-20 16:49:32 · 391 阅读 · 0 评论 -
在C#中使用Task类解决线程的等待问题
文章目录前言Task类示例小结前言在任何的编程语言中,面对耗时任务 TTT 时,我们都会有这样的需求:让 TTT 执行 n 秒,如果到时仍然完成不了,那么就不再等待。这样的代码如果自己写类来实现的话并不困难,然而实际上C#已经内置了Task类用于解决此问题。Task类Task是C#中专门用于接收任务的类,通过构造函数接收任务,使用start()方法启动。当任务启动以后,可以使用Task.WaitAll(Task[] tasks, int timeout) 等待所有任务完成后或时间到 timeout原创 2020-07-07 14:57:23 · 6403 阅读 · 0 评论 -
关于在XP上运行C#程序几点注意
虽然XP已经断更多年,但是目前一些工控机仍然会用XP,因此本文主要介绍了XP下运行C#程序的相关内容。原创 2020-06-19 11:18:55 · 1576 阅读 · 0 评论 -
在DOS下制作进度条
在DOS下,为了显示一些进度信息,使用C#在.net core 3.1下编写了一个类ControlProcessBar类,用于显示进度信息。基本原理是通过 `Console.CursorLeft` 和 `Console.CursorTop` 进行定位,通过 `Console.BackgroundColor` 和 `Console.ForegroundColor` 进行颜色设置。原创 2020-04-16 16:43:01 · 668 阅读 · 0 评论 -
部署Windows下开发的.Net Core程序至Linux系统
在Windows上开发,然后发布开发好的应用到Linux服务器是一个非常常见的流程。在.Net Core 开发中,同样也有这个流程,本文以图文形式就如何部署Windows下开发的.Net Core程序至Ubuntu系统进行介绍。原创 2020-04-13 08:06:55 · 1794 阅读 · 2 评论 -
在C#和Java间使用AES加密和解密
AES 是 Advanced Encryption Standard 的缩写,即 高级加密标准。使用AES加密最大好好处在于可以使用2把钥匙,一把公钥一把私钥进行加密和解密处理。这样即便公钥暴露,还有私钥保护,数据仍然是安全的。由于C#和Java的语言特性不同,加密和解密端如果分别使用了这两种不同的语言,那么应该如何设置呢,会不会报错呢。本文就这个问题,以具体的实例给出了答案。原创 2019-01-10 17:33:56 · 1306 阅读 · 0 评论 -
C#非托管与托管下的数组读写性能基本一样
本文测试了托管和非托管两种情况下,对数据访问的性能差异。基本结论是两者性能基本一致,所以建议使用托管代码。而非托管代码仅在需要调用底层接口时使用。原创 2020-03-24 08:52:39 · 637 阅读 · 0 评论 -
通过object类型实现C#泛型与具体类型的类型转换
泛型能够通过抽象以简单同类型的操作。在进行泛型操作的时候,数据类型转换也是常见的一种基本操作。泛型可以直接进行数据转换,如:int a = 0;object o = a;T t = (T) o;但是注意,在做数据转换的时候,如果对象是某个具体数据格式,则无法使用 (T)o 的形式直接进行数据转换。比如,在某项目中,有个 CADEntityCollection 类,它是一个 CADEnti...原创 2020-01-17 16:24:15 · 9083 阅读 · 0 评论 -
从一个学员的代码看源代码管理
private void 日志_Load(object sender, EventArgs e) { this.listView1.BeginUpdate(); StreamReader sr = new StreamReader(Common.StartFolder + "\\record.log"); while (sr.Pee...原创 2019-12-12 22:19:05 · 465 阅读 · 1 评论 -
在C#中正确处理NullPointerException问题
面向对象的程序设计中,一个最经常遇到的问题就是NullPointerException问题,即空指针问题。如判断 person.address.code.text 的值,如果中间任何一个对象为空,都会造成错误。而为了避免空指针,我们不得不写出繁琐的验证代码,不仅费时,而且可能出错。为了解决这个问题,C#引用了?.和??操作,极大地简化了这个操作。本文就通过具体的实例,介绍如何进行空值的访问和比较操作。原创 2019-11-06 07:14:55 · 2129 阅读 · 0 评论 -
C#中自定义格式化日期字符串实例详解
文章目录简介转义符号表英文示例中文示例参考资料简介将C#中的日期转成完成字符串,可以使用ToString()方法,如 DateTime.Now.ToString()。为了实现更多复杂的指定的格式的要求,我们可以在ToString()方法中添加所需要的格式参数,如:DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"),则输出为格式为 2019/10/07 17...原创 2019-10-07 17:37:57 · 3914 阅读 · 0 评论 -
C#代理机制(5):委托的本质
代理是用于代理函数,其本质就是**函数指针**,即一个指向函数的指针,通过这个指针可以调用这个函数。在C/C++中,我们可以除了可以使用指针实现对数据的引用,同样还可以使用函数指针实现对函数的引用。由于这个机制比较复杂,而且非常容易出错,所以在C#早期的版本并没有实现这个功能。直到C#3.0,代理的追加,才实现了这个功能。原创 2019-11-05 16:03:05 · 990 阅读 · 0 评论 -
C#代理机制(4):Func
Func是.NET类库从3.0开始新增的内置委托,用于实现返回类型为任何有返回类型的函数的调用。Func的参数列表的格式为传入类型参数列表+返回列表。举例来说,以下示例定义了一个Fun, IsAdult(int) 赋值后,再进行调用。public override void Test(){ // Predicate示例 Predicate<int> pred = Show; ...原创 2019-11-01 14:00:21 · 636 阅读 · 0 评论 -
C#代理机制(3):Predicate
Predicate 是.NET类库从3.0开始新增的内置委托,用于实现返回类型为bool型的函数的调用。以下示例定义了一个Predicate,在使用已经有函数 IsAdult(int) 赋值后,再进行调用。public override void Test(){ Predicate<int> fun = Show; if(!fun(20)) { Console.Writ...原创 2019-10-31 07:01:18 · 3099 阅读 · 2 评论 -
C#委托机制(2):Action
Action 是.NET类库从3.0开始新增的内置委托,用于实现对无返回函数的调用。以下示例定义了一个Action,在使用已经有函数Show赋值后,再进行调用。public override void Test(){ Action<string> fun = Show; fun("hello");}public void Show(string s){ Consol...原创 2019-10-30 06:13:28 · 1785 阅读 · 0 评论 -
C#委托机制(1):什么是委托?
简介在C#中,最基本的内容不外乎数据和函数。就象做菜一样,数据是原料,函数是操作。C#中提供了多种数据类型用于表示数据,同时提供了函数,用于定义对数据的操作。举例来说,以下函数定义了一个基本操作函数将传入字符串以指定格式输出。public void Show(string message){ Console.WriteLine("[{0}] {1}", DateTime.Now.ToStr...原创 2019-10-29 14:49:51 · 537 阅读 · 0 评论 -
C#利用泛型和反射实现对字符串转枚举的通用转换函数
本文设计并实现了一种利用泛型和反射实现的通用的支持大小写敏感的字符串转换成枚举型的函数。通过这个函数,我们可以方便地对所有枚举类型进行字符串转换。原创 2019-10-21 08:34:53 · 1400 阅读 · 0 评论 -
PDF拆分与合并工具(DOS版)
说明为了便于PDF文件页面的拆分操作,本人利用第三方类库的功能,设计并实现了一个DOS程序,通过特定的语法,实现对PDF页面的删除、合并、拆分、顺序调整等功能。语法程序共有4个参数(顺序要一致): $op $inputlist $outputlist [$parameters]。作用分别如下所示:$op 操作类型,目前只支持 merge:merge 用于一个或多个文件的合并以指定页面...原创 2019-10-12 16:17:09 · 1186 阅读 · 0 评论 -
类中的变量从字段到属性的五个阶段的进化
前言在面向对象的程序设计中,类是最核心的内容。而在类的定义中,最基本的内容就是字段,本文就字段的进化进行简要介绍。包括什么是字段,什么是属性,即产生的原因和进化的结果。阶段一:字段在C#之前的语言,在类中的变量都是使用字段表示,如下所示:// 类的定义class Person{ public string Name = "张三"; public string Secret...原创 2019-08-10 07:51:28 · 616 阅读 · 0 评论 -
一个简单的类实现C#配置窗体中所有配置值变化的监听(附源代码)
文章目录问题描述解决方案第1步:获得所有控件第2步:对需要监控的控件进行处理使用方法注意事项附录:源代码问题描述在配置窗体中,为了更好地提高用户体验,当某个值发生变化时,需要向用户提供是否保存。如果没有变化则不需要。举例说明。如下图所示,在这个界面有四配置内容:通用参数配置、压力源配置、温度配置和传感器配置。在每类配置中,又有很多具体的配置项。左上角的保存默认是灰色的,如果修改了任何一个值,那...原创 2019-08-24 14:00:54 · 2983 阅读 · 1 评论 -
关于this指针的使用注意事项详解
this 指针简介在面向对象的程序设计语言中,都有一个默认的this关键字。这个关键字的作用就是代表当前对象,可以通过 this 引用所有的类内的全局变量或方法。但是 this 指针在使用的时候,有很多要注意的地方,如果不注意的话,会造成滥用带来未知的麻烦。使用限制只能在非静态方法中使用,包括普通方法和构造函数;可以引用所有的类的成员,包括字段和方法;只能在方法体内使用,包括普通方法和...原创 2019-08-25 20:09:58 · 917 阅读 · 0 评论 -
将一个C#的可执行项目(输出为EXE)转换成一个动态链接库(输出为DLL)
文章目录问题实例说明附:引用类库项目以便于调试问题在C#的项目中,常见的类型有可执行文件,即EXE文件;另一种常见的类型是动态链接库,即DLL文件,用于其他程序的调用。在C#中我们如何进行两种类型的修改呢?实例说明先在解决方案资源管理器中右键选择需要变更项目类型的项目,如下图所示。选择输出类型如下所示,共有三种类型:Windows应用程序即最常用的桌面应用程序,程序的默认入...原创 2019-08-22 10:08:35 · 2637 阅读 · 0 评论 -
C#获得总物理内存和可用物理内存大小几个函数
说明现在网上有很多关于C#获取内存的方法,但是多是从国外某网站抄过来。本文对这些方法进行了测试,并选择了比较好的一种实现方式进行了实现,并在实现后进行了测试。实现原理基于 System.Memanement.ManagementClass 实现。这个类是对硬件信息WMI的具体封装,具体相关内容可以参见 Windows Management Instrumentation。函数说明lon...原创 2019-09-09 11:45:19 · 4933 阅读 · 4 评论 -
小技巧:利用 MemberwiseClone() 简化 C# 中 Clone() 深克隆代码
前言在单例模式的应用场景中,Clone() 方法会大量使用,我们在写代码的时候经常会写很多的代码,用于字段或属性的复制,这样的操作不仅麻烦,而且在变更时也不易于修改。实际上我们有更简单的方法,现在就以一个实例来解释这个技巧。示例class Student{ public int ID {get; set;} = 0; public string Name {get; set...原创 2019-08-19 15:43:49 · 2753 阅读 · 0 评论 -
超简单的枚举类型与ComboBox动态关联方法
需求在C#项目中,经常会有枚举型与ComboBox进行关联的需求。这样的需求如果使用字符串来处理,则每次都要转换比较麻烦。本文给出了一种基于泛型的窗体数据动态绑定与读取的方法,从而能够在大部分情况下可以一劳永逸地解决问题。输入枚举型我们使用以下枚举型为示例。显示窗体为默认Form1,然后在上面添加一个ComboBox对象comboBox1。 public enum LogType { ...原创 2019-08-14 09:47:56 · 2128 阅读 · 2 评论 -
通过C#的反射机制对对象的字段进行动态统一操作
分析数据在存储的时候,常用的方式就是序列化,即将对象保存为字符串。在[1]中,序列化已经实现了。本文重点是反序列化,即从字符串转换为原来的数据类型。自动化的反序列化的关键是要解决两个问题:如何实现反序列化如何自动化处理解决办法对于第一个问题,我们将使用所有基本数据类型都有的一个静态方法 Parse 来实现。通过使用这个静态函数,我们可以非常方便地实现所有的基本数据类型的转换。对于第...原创 2019-07-28 20:11:15 · 779 阅读 · 0 评论 -
C#中一个简单的使用反射显示类中的所有变量的方法
如果一个类中,有很多的属性,我们在显示的时候,需要逐一进行展示,很是麻烦。利用反射技术,我们可以很方便进显示。直接看代码:public calss Values{ public int ID = 1; public double Value1 = 1.5; public double Value2 = 2.6; /// <summary> ...原创 2019-07-28 08:13:58 · 2049 阅读 · 0 评论