自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1644)
  • 收藏
  • 关注

原创 C#设计模式之订阅发布模式详解4

通过如上代码我们试着去解决我们第一处所说的问题,我们会发现使用event关键字后可以保护我们OnChange免受不必要的访问。如果说我们觉得如上的过程不是我们预期的,我们需要手动引发事件并处理异常,这时候我们可以使用Delegate基类中定义的GetInvoctionList来帮助我们实现这些。如上代码我们创建了一个发布者,并且我们调用委托进行创建我们匿名方法来订阅。运行如上代码后,大家会发现第一个订阅者已经执行成功了,第二个订阅者引发了异常,而第三个订阅者未被调用.这是一个很尴尬的事情.

2024-05-17 21:07:57 579

原创 C#中事件:发布订阅模式实例详解3

委托可以使用额外的运算符来组合.这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本连接.委托是恒定的,操作数委托创建后不会被改变,委托组合拷贝的是操作数的副本。在Main方法中,我们需要构建几个Rat对象和一个Cat对象,将Rat对象添加到Cat对象的集合中,调用Cat对象的Shout方法。委托存储的是一系列具有相同签名和返回值类型的方法的地址,调用委托的时候,委托包含的所有方法将被执行。(只是一个测试 不写的很详细了 还是拿猫和老鼠举例子 猫类和老鼠类 以及定义的委托的代码如下)

2024-05-17 21:03:42 485

原创 C#中事件:发布订阅模式实例详解2

Console.WriteLine("AEvent add被调用,value的HashCode为:" + value.GetHashCode());当事件被触发的时候,订阅者得到通知,而订阅者所提交的所有方法都会被执行。Console.WriteLine("触发对象:{0}, 保存信息:{1}", sender.ToString(), e.Information);Console.WriteLine("触发对象:{0}, 保存信息:{1}", info, sender.ToString());

2024-05-17 20:55:48 722

原创 C#发布订阅模式详解

Console.WriteLine($"{name}收到{work.name}的工作, 大概需要{work.workLoad/workSpeed}分钟, {boss.name}.");实现发布订阅模式的土方法:声明委托类,在发布者类中声明委托类成员,定义发布方法(事件触发),声明订阅类,在订阅类中声明订阅方法(绑定到订阅者的委托(事件)成员中)。Console.WriteLine($"\n{this.status} -> {status} 大家开始学习嗷");", works);// 调用事件触发方法.

2024-05-17 20:48:38 569

原创 C#中的事件(委托的发布和订阅、事件的发布和订阅、EventHandler类、Windows事件)实例详解,观察者(Observer)模式也称发布-订阅(Publish-Subscribe)模式

object类型的参数sender表示引发事件的对象,由于事件成员只能由类型本身(即事件的发布者)触发,因此在触发时传递给该参数的值通常为this。引发事件的对象称为事件的源或发送者。在事件发布和订阅的过程中,定义事件的类型(即委托类型)是一件重复性的工作,为此,.NET类库中定义了一个EventHandler委托类型,并建议尽量使用该类型作为事件的委托类型。事件是类的一种特殊成员:即使是公有事件,除了其所属类型之外,其他类型只能对其进行订阅或取消,别的任何操作都是不允许的,因此事件具有特殊的封装性。

2024-05-16 22:26:11 627

原创 C#中实现一个安全的事件订阅器实例

接受消息的方法

2024-05-16 22:12:58 550

原创 编程中事件驱动架构概述

现在的技术发展快,前后端不断涌现各种框架,我们恨不得把这些框架都用在自己的项目里才行,按实际出发,按需所用,适当的预留技术预研的空间。事件具有自己的属性,比如发生的时间、发生了什么、事件之间的关系、状态以及变化,事件也可以生成新的事件,根据不同的事件生成新的业务事件。事件溯源是一个特别的思路,它并不持久化实体对象,而是只把初始状态和每次变更的事件记录下来,并在内存中根据事件还原实体对象的最新状态,mysql主从备份用到的binary log以及redis的aof持久化机制,都可以认为是“事件溯源”的实现。

2024-05-16 21:53:32 412

原创 C#用S7.net.dll控制西门子S1200PLC

Read还有一个按偏移量去读取的,可以批量连续读取相同数据类型的,我这里的案例就只读一个出来,为了演示而已。类写入的情况一样我们要用到刚刚建立的类,然后给类赋值,这里使用DB3块做样例。DataType:数据存储的位置类型。DataType:数据存储的位置类型。DataType:数据存储的位置类型。count:结束的偏移量位置,也可以理解读取多少个位数据上来。rack:机台号的位置,这个也是PLC的知识点。slot:插槽号的位置,也是PLC的知识点。startByteAdr:开始的偏移量位置。

2024-05-14 19:59:02 400

原创 c#中子线程和主线程交叉引用阻塞问题解决办法

方案2: // info.BeginInvoke(new Action(() =>//此处阻塞原因是因为info的子线程和主线程在其他地方交叉使用了,此处造成了子线程阻塞,导致此处的主线程也阻塞了,而恰好其他地方又使用了主线程,陷入了死循环。方案1:// Task.Factory.StartNew(() => {//加入子线程来执行这块逻辑,如能通过则下面的猜想是对的,经验证与所述一致。(所以可以用多线程或BeginInvoke解决此阻塞问题)//注意:防止子线程和主线程交叉引用后的阻塞问题。

2024-05-14 19:49:22 118

原创 c#中泛型委托,方法的声明及定义实例(全)

泛型很适用于集合,我们常见的泛型集合有:List<T>,Dictionary<K,V>等等(T,K,V就代表不确定的类型,它是一种类型占位符,当然你也可以使用其他符号代替,只不过一般常规都是用T,T1,T2这种,如A,B,C,AA,BB,ABC...等等都可以,甚至一个单词或汉字也可以,因为编译器最终编译的时候会将这些占位符替换成对应的实际类型,也就是泛型要使用的实例的类型),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。

2024-05-13 22:51:47 776

原创 C语言预处理命令总结说明

后是指令关键字,在关键字和 # 号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的,程序员在程序中用预处理命令来调用这些功能。条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码。#ifdef 如果宏已经定义,则编译下面代码。

2024-05-01 20:51:30 130

原创 C语言#include的用法详解(文件包含命令)详解

#include叫做文件包含命令,用来引入对应的头文件(.h文件)。#include 也是C语言预处理命令的一种。#include 的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。#include 的用法有两种,如下所示:#include <stdHeader.h>#include "myHeader.h"使用尖括号< >和双引号" "的区别在于头文件的搜索路径不同:使用尖括号< &

2024-05-01 20:50:32 347

原创 C语言各种预处理命令详解

但是现在有个问题,程序中要实现的某个功能在 VS 和 GCC 下使用的函数不同(假设 VS 下使用 a(),GCC 下使用 b()),VS 下的函数在 GCC 下不能编译通过,GCC 下的函数在 VS 下也不能编译通过,怎么办呢?不同的平台下必须调用不同的函数,并引入不同的头文件,否则就会导致编译错误,因为 Windows 平台下没有 sleep() 函数,也没有 <unistd.h> 头文件,反之亦然。你看,在不同的平台下,编译之前(预处理之后)的源代码都是不一样的。这种以#号开头的命令称为预处理命令。

2024-05-01 20:48:38 287

原创 C语言指针是什么?彻底理解C语言指针的概念

当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。( )表示取值操作,整个表达式的意思是,取出地址 0X1000 和 0X2000 上的值,将它们相加,把相加的结果赋值给地址为 0X3000 的内存。

2024-05-01 20:45:11 337

原创 C语言指针变量的定义和使用详解(精华)

上节我们说过,CPU 读写数据必须要知道数据在内存中的地址,普通变量和指针变量都是地址的助记符,虽然通过 *p 和 a 获取到的数据一样,但它们的运行过程稍有不同:a 只需要一次运算就能够取得数据,而 *p 要经过两次运算,多了一层“间接”。值得注意的是,p_a 需要的一个地址,a 前面必须要加取地址符&,否则是不对的。*&a可以理解为*(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。

2024-05-01 20:43:43 19

原创 C语言指针数组详解(数组每个元素都是指针)

parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。第二个 printf() 语句中,parr+i 表示第 i 个元素的地址,*(parr+i) 表示获取第 i 个元素的值(该元素是一个指针),**(parr+i) 表示获取第 i 个元素指向的数据。为了便于理解,可以将上面的字符串数组改成下面的形式,它们都是等价的。

2024-05-01 20:42:08 253

原创 C语言函数指针(指向函数的指针)详解示例演示

一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。注意( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(param list);//返回两个数中较大的一个。

2024-05-01 20:40:54 236

原创 C语言指针的总结详解(1)

程序在运行过程中需要的是数据和指令的地址,变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符:在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址;5) 数组也是有类型的,数组名的本意是表示一组类型相同的数据。2) 给指针变量赋值时,要将一份数据的地址赋给它,不能直接赋给一个整数,例如int *p = 1000;p 可以指向 int 类型的数据,也可以指向类似 int arr[n] 的数组。定 义 含 义。

2024-05-01 20:39:15 135

原创 c#中泛型方法的声明及定义实例(2-2)

泛型很适用于集合,我们常见的泛型集合有:List,Dictionary等等(T,K,V就代表不确定的类型,它是一种类型占位符),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。/实例演示******************************************************************//************************************ 泛型方法声明定义及使用。

2024-04-29 21:05:38 833

原创 C#中泛型详解(4)

在泛型类型或方法定义中,类型参数是在其实例化泛型类型的一个变量时,客户端指定的特定类型的占位符。从上面的结果中我们可以看出这三个方法,除了传入的参数不同外,其里面实现的功能都是一样的。泛型是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。从上面的结果中我们可以看出,使用Object类型达到了我们的要求,解决了代码的可复用。可以看到,在泛型接口的T前面有一个out关键字修饰,而且T只能是返回值类型,不能作为参数类型,这就是协变。这样会造成类型不安全的问题。

2024-04-29 20:57:30 409

原创 C#中泛型<T>(特殊的占位符)的使用详解

泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。泛型很适用于集合,我们常见的泛型集合有:List<T>,Dictionary<K,V>等等(T,K,V就代表不确定的类型,它是一种类型占位符),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。

2024-04-29 20:54:44 564

原创 C#中委托和事件的区别详解

事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。○ 在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。○ 触发委托有2种方式: 委托实例.Invoke(参数列表),委托实例(参数列表)以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。○ 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例。而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。

2024-04-29 20:47:39 395

原创 c#中泛型方法的声明及定义实例(3)

/ 此委托封装的方法的参数类型。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。这样就可以使用一个带T泛型但无参数的泛型委托了,类似与Action的封装但是可以不带T类型的参数调用。//上面是自带封装好的Action,除其他重载的外这个参数形式是固定的。// 封装一个方法,该方法只有一个参数并且不返回值。注意:防止静态事件注册多个方法,这样会执行很多次实例中的函数。// 此委托封装的方法的参数。//使用实例时必须要有参数。

2024-04-29 20:44:37 100

原创 c#中泛型方法的声明及定义实例(2)

/************************************ 泛型方法声明定义及使用。//自定义委托,可替代Action和Func(Action和Func实质上是封装好的委托)//将委托封装成事件来注册,则可以一个事件注册多个同类型方法(事件执行将调用全部已注册过的方法)//泛型声明的时候是T,定义实例的时候需要填具体的参数类型(而不是T或T1,T2)

2024-04-28 21:50:36 447

原创 c#中泛型方法的使用实例

如果定义采用相同类型参数作为包含类的泛型方法,编译器将生成警告 CS0693,因为在方法范围内为内部 T 提供的参数隐藏了为外部 T 提供的参数。如果需要使用其他类型参数(而不是实例化类时提供的类型参数)来灵活地调用泛型类方法,请考虑为方法的类型参数提供另一个标识符,如下面示例的 GenericList2<T> 中所示。定义一个泛型类指的是,定义一个类,这个类中某些字段的类型是不确定的,这些类型可以在构造的时候确定下来。//实现了任意类型组拼成字符串的方法,可以是int,double,string等类型。

2024-04-28 20:47:47 268

原创 C#中泛型方法的定义及使用方法

其中where子句为可选约束语句,T:后面的Test为指定类型,new ():函数主体要使用T类型实例化时必须加此参数,否则编译不通过。当具有自己的类型参数的成员函数需要将该参数约束为包含类型的类型参数时,裸类型约束很有用。/***************************************C# 定义泛型方法。在使用泛型后,方法中的数据类型则有指定的泛型来约束,即可以根据提供的泛型来传递不同类型的参数。为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

2024-04-28 20:31:07 655

原创 C# 中泛型编程之泛型类、泛型方法、泛型约束详解

类型Type现在可以表示带有特定类型的实参(或绑定类型)或未指定类型的泛型(或称未绑定类型)。委托级别的约束只在声明委托变量和实例化委托时使用,类似于在类型和方法的作用范围中实施的其他任何约束。同时子类中的泛型方法不能重复基类泛型方法的约束,这一点和泛型类中的虚方法重写是有区别的,代码如下。////错误 重写和显式接口实现方法的约束是从基方法继承的,因此不能直接指定这些约束。类型参数必须具有无参数的公共构造函数。3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)

2024-04-28 20:19:05 849

原创 c#中自定义泛型委托实现Action和Func的实例比较及lambda表达式写法

/自定义委托,可替代Action和Func(Action和Func实质上是封装好的委托)//将委托封装成事件来注册,则可以一个事件注册多个同类型方法(事件执行将调用全部已注册过的方法)//泛型声明的时候是T,定义实例的时候需要填具体的参数类型(而不是T或T1,T2)//自定义委托(Action和Func实质上是封装好的委托)//Action和Func实质上是封装好的委托。

2024-04-27 18:18:45 327

原创 C#中Func与Action的理解及其lambda表达式的写法

委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储、传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托。这些泛型委托分为Func、Action中,它们借助于泛型特性,可以替代C#中几乎所有的委托类型,也就是说一般情况下,在我们的程序中不必再声明任何新的委托类型,就可以包装所有的函数了。//********************************lambda表达式的写法示例。

2024-04-27 17:59:01 432

原创 C# 中匿名方法实例详解

我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。

2024-04-27 12:14:00 557

原创 C#中泛型的概念详解

什么是泛型?C# 语言和公共语言运行时 (CLR) 在 2.0 版本中添加了泛型。泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有相同特征的类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型(使用占位符~3:数字代表类型参数个数)。泛型有什么用?使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。泛型最常见的用途是创建集合类 List<int>。可以创建:泛型接口、泛型类、泛型方法、泛型事件和泛型委托。泛型约束有哪些?

2024-04-27 12:13:04 1005

原创 C#泛型委托事件详解及实例

// 泛型委托的构造类型:需要一个形参为int类型、返回值类型为bool类型的方法对其进行初始化/// 泛型委托的构造类型:需要一个形参为string类型、返回值类型为int类型的方法对齐进行初始化.NET给我们预定义了很多泛型委托,日常编码工作中使用这些类型的泛型委托基本就已足够,下面我们只介绍三个常用的预定义的泛型委托。

2024-04-27 12:07:37 827

原创 C#中一个方法的Lambda表达式(实质上是一个委托)

不过,有时以一种非正式的方式谈论Lambda表达式的“类型”会很方便,在这些情况下,类型是指委托类型或Lambda表达式所转换到的Expression类型。根据主题不同,Lambda表达式可以分为表达式Lambda和语句Lambda。下面的示例使用包含三个组件的元组,将一系列数字传递给Lambda表达式,此表达式将每个值翻倍,然后返回包含乘法运算结果的元组(内含三个元组)。例如:Lambda表达式x => x * x,指定名为x的参数,并返回x的平方值,并将表达式x => x * x分配给委托类型的变量。

2024-04-27 12:01:58 772

原创 C#中Action和Func的用法详解及实例

以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有,Action<in T1,in T2>1:小明很是苦恼,我就是买一本书籍,每次都让我定义下,烦死了,有没有一种方法不去定义委托呢,那么有吗,还真有,就是我们今天讲的Action。

2024-04-27 11:50:13 516

原创 winform继承窗体后子窗体不能使用设计器显示的问题解决

第二点:屏蔽掉父窗体类的控件初始化方法,即//InitializeComponent();与网上百度到的跟平台有关系啊什么的毫无作用,目前使用的是VS2019。如果有抽象类即将抽象类改为普通类,需要实现的抽象方法改为虚方法。winform继承窗体后子窗体不能使用设计器显示的问题。第三点:注意前两点修改完成后,关闭所有窗体,重新编译。第一点:继承的父窗体类不能使用抽象类。

2024-04-27 11:47:23 88

原创 原码反码补码的概念详解及转换方法实例

如果补码的首位是0,那它就表示一个正数,直接把二进制数转换为十进制数就行。例如:[x]补=00110010,因为(110010)2=50x的真值就是50。如果补码的首位是1,那它就表示一个负数,可以先-1算出它的反码,再根据反码写出原码。最后把符号位后面的二进制数转换为十进制数,前面加上“-”就行。例如:[x]补=10110010,则[x]反=10110001,[x]原=11001110(注意:符号位的1不参与取反不变)因为(1001110)2=78x的真值就是-78。

2024-04-27 11:45:35 473

原创 C# 中利用NI VISA 库控制硬件设备采集实例

首先,http://www.ni.com/download/ni-visa-16.0/6184/en/建议您下载完整版的NI-VISA。-Session的子类 ,封装了 session 资源,Session子类的方法执行 session 资源对象 的具体操作,进入NI 官网,点击Support,根据设备类型选择下载,如果不是GBIP接口的仪表,可以像我一样,选择NI-VISA。/**********************C# winform使用NI-VISA驱动来控制IT6522数控电源。

2024-04-27 11:26:48 580

原创 C# WinForm 绘制圆角窗体的方法实例

/ 左上角// 右上角// 右下角// 左下角。

2024-04-27 11:14:39 177

原创 c#中实体类和DataTable之间相互转换,实体反射动态遍历列详解

通过反射,你可以加载和检查程序集的信息,包括类型、成员、属性等。请注意,上述示例中的 Person 类只是一个示例,你可以根据自己的需求创建自定义的实体类,并根据 DataTable 的列名称和类型匹配属性。为了将列定义为可为空类型,我们使用了 typeof(object) 来定义列的类型,这样可以允许任意的对象,并且可以在需要时将其设置为 DBNull.Value 来表示空值。请注意,上述示例中的实体类 Person 只是一个示例,你可以根据自己的需求创建自定义的实体类,并使用相应的属性和类型。

2024-04-27 11:11:24 564

原创 C#中操作快捷方式(获取快捷方式属性、创建快捷方式)的方法

右键“引用”,“添加引用”,选择“COM组件”,找到“Windows Script Host Object Model”,然后确定。13 // 设置快捷方式的图标,这里是取程序图标,如果希望指定一个ico文件,那么请写路径。10 shortcut.Description = "我的快捷方式--yeaicc";9 // 快捷方式描述,鼠标放到快捷方式上会显示出来哦。15 // 保存,创建就成功了。3 // 创建一个快捷方式。1 // 声明操作对象。5 // 关联的程序。11 // 全局热键。

2024-04-27 11:08:24 187

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除