重要概念
文章平均质量分 80
luckyone906
这个作者很懒,什么都没留下…
展开
-
c#中泛型委托,方法的声明及定义实例(全)
泛型很适用于集合,我们常见的泛型集合有:List<T>,Dictionary<K,V>等等(T,K,V就代表不确定的类型,它是一种类型占位符,当然你也可以使用其他符号代替,只不过一般常规都是用T,T1,T2这种,如A,B,C,AA,BB,ABC...等等都可以,甚至一个单词或汉字也可以,因为编译器最终编译的时候会将这些占位符替换成对应的实际类型,也就是泛型要使用的实例的类型),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。原创 2024-05-13 22:51:47 · 862 阅读 · 0 评论 -
c#中泛型方法的声明及定义实例(2-2)
泛型很适用于集合,我们常见的泛型集合有:List,Dictionary等等(T,K,V就代表不确定的类型,它是一种类型占位符),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。/实例演示******************************************************************//************************************ 泛型方法声明定义及使用。原创 2024-04-29 21:05:38 · 978 阅读 · 0 评论 -
C#中泛型详解(4)
在泛型类型或方法定义中,类型参数是在其实例化泛型类型的一个变量时,客户端指定的特定类型的占位符。从上面的结果中我们可以看出这三个方法,除了传入的参数不同外,其里面实现的功能都是一样的。泛型是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。从上面的结果中我们可以看出,使用Object类型达到了我们的要求,解决了代码的可复用。可以看到,在泛型接口的T前面有一个out关键字修饰,而且T只能是返回值类型,不能作为参数类型,这就是协变。这样会造成类型不安全的问题。原创 2024-04-29 20:57:30 · 453 阅读 · 0 评论 -
C#中泛型<T>(特殊的占位符)的使用详解
泛型(Generic),是将不确定的类型预先定义下来的一种C#高级语法,我们在使用一个类,接口或者方法前,不知道用户将来传什么类型,或者我们写的类,接口或方法相同的代码可以服务不同的类型,就可以定义为泛型。这会大大简化我们的代码结构,同时让后期维护变得容易。泛型很适用于集合,我们常见的泛型集合有:List<T>,Dictionary<K,V>等等(T,K,V就代表不确定的类型,它是一种类型占位符),无一不是利用的泛型这一特性,若没有泛型,我们会多出很多重载方法,以解决类型不同,但是执行逻辑相同的情况。原创 2024-04-29 20:54:44 · 1321 阅读 · 1 评论 -
C#中委托和事件的区别详解
事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。○ 在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。○ 触发委托有2种方式: 委托实例.Invoke(参数列表),委托实例(参数列表)以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。○ 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例。而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。原创 2024-04-29 20:47:39 · 1199 阅读 · 0 评论 -
c#中泛型方法的声明及定义实例(2)
/************************************ 泛型方法声明定义及使用。//自定义委托,可替代Action和Func(Action和Func实质上是封装好的委托)//将委托封装成事件来注册,则可以一个事件注册多个同类型方法(事件执行将调用全部已注册过的方法)//泛型声明的时候是T,定义实例的时候需要填具体的参数类型(而不是T或T1,T2)原创 2024-04-28 21:50:36 · 512 阅读 · 0 评论 -
c#中自定义泛型委托实现Action和Func的实例比较及lambda表达式写法
/自定义委托,可替代Action和Func(Action和Func实质上是封装好的委托)//将委托封装成事件来注册,则可以一个事件注册多个同类型方法(事件执行将调用全部已注册过的方法)//泛型声明的时候是T,定义实例的时候需要填具体的参数类型(而不是T或T1,T2)//自定义委托(Action和Func实质上是封装好的委托)//Action和Func实质上是封装好的委托。原创 2024-04-27 18:18:45 · 376 阅读 · 0 评论 -
C#中Func与Action的理解及其lambda表达式的写法
委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储、传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托。这些泛型委托分为Func、Action中,它们借助于泛型特性,可以替代C#中几乎所有的委托类型,也就是说一般情况下,在我们的程序中不必再声明任何新的委托类型,就可以包装所有的函数了。//********************************lambda表达式的写法示例。原创 2024-04-27 17:59:01 · 1833 阅读 · 0 评论 -
C# 中匿名方法实例详解
我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。原创 2024-04-27 12:14:00 · 573 阅读 · 0 评论 -
C#中泛型的概念详解
什么是泛型?C# 语言和公共语言运行时 (CLR) 在 2.0 版本中添加了泛型。泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有相同特征的类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型(使用占位符~3:数字代表类型参数个数)。泛型有什么用?使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。泛型最常见的用途是创建集合类 List<int>。可以创建:泛型接口、泛型类、泛型方法、泛型事件和泛型委托。泛型约束有哪些?原创 2024-04-27 12:13:04 · 2017 阅读 · 0 评论 -
C#泛型委托事件详解及实例
// 泛型委托的构造类型:需要一个形参为int类型、返回值类型为bool类型的方法对其进行初始化/// 泛型委托的构造类型:需要一个形参为string类型、返回值类型为int类型的方法对齐进行初始化.NET给我们预定义了很多泛型委托,日常编码工作中使用这些类型的泛型委托基本就已足够,下面我们只介绍三个常用的预定义的泛型委托。原创 2024-04-27 12:07:37 · 996 阅读 · 0 评论 -
C#中一个方法的Lambda表达式(实质上是一个委托)
不过,有时以一种非正式的方式谈论Lambda表达式的“类型”会很方便,在这些情况下,类型是指委托类型或Lambda表达式所转换到的Expression类型。根据主题不同,Lambda表达式可以分为表达式Lambda和语句Lambda。下面的示例使用包含三个组件的元组,将一系列数字传递给Lambda表达式,此表达式将每个值翻倍,然后返回包含乘法运算结果的元组(内含三个元组)。例如:Lambda表达式x => x * x,指定名为x的参数,并返回x的平方值,并将表达式x => x * x分配给委托类型的变量。原创 2024-04-27 12:01:58 · 879 阅读 · 0 评论 -
C#中Action和Func的用法详解及实例
以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发现确实代码简洁了不少。3:现在小明又改变主意了,我不仅要自己选择书籍,我还要在一个牛逼的书籍厂家买,有没有这种方式呢,那么告诉你有,Action<in T1,in T2>1:小明很是苦恼,我就是买一本书籍,每次都让我定义下,烦死了,有没有一种方法不去定义委托呢,那么有吗,还真有,就是我们今天讲的Action。原创 2024-04-27 11:50:13 · 1731 阅读 · 0 评论 -
C#-深入解析编程中泛型委托的使用及多播委托实例
c#原创 2023-02-14 20:49:52 · 546 阅读 · 0 评论 -
C++基本知识点
1.字符串的末尾''也算一个字符,一个字节。2.使用库函数strcpy(a,b)进行拷贝b->a操作,strcpy会从源地址一直往后拷贝,直到遇到''为止。所以拷贝的长度是不定的。如果一直没有遇到''导致越界访问非法内存,程序就崩了。3.strlen的结果未统计’’所占用的1个字节。4.写出完整的strcpy函数char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) &..原创 2022-05-19 19:41:41 · 827 阅读 · 0 评论 -
C++中malloc与new方法动态创建数组并释放
#include<iostream>using namespace std;int main(){//动态创建释放一维数组(new)int *a;//基地址int n=10;//数组大小a=new int[n];//创建 delete[] a;//释放//动态创建释放二维数组(new)int **b;int m=10;n=10;b=new int*[m];for(int i=0;i<m;i++)b[i]=new int[n];for(i=0;i<m;..原创 2022-11-10 21:05:24 · 684 阅读 · 0 评论 -
使用函数指针实现父类函数调用子类函数的两种方式
父子类关系对于继承关系中的父类和子类,我们可以说子类是父类的一种,子类继承了父类的属性和行为。因此,子类可以访问父类的所有非私有成员。相反,父类一般情况下是不能访问子类成员的。然而,我们可以通过一些方法间接的实现父类访问子类,即父类函数访问子类函数。方法一利用多态机制,一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一个引用或者指针调用虚函数来实现。如下面所示:Class Base{public:原创 2021-02-15 18:59:42 · 6237 阅读 · 5 评论 -
子类继承父类后调用virtual函数问题(base.函数名)
void Main(){SonB s = new SonB(); s.Show();//先调用子类的函数,再调用基类的函数(在子类方法中base.Show())}//**************public class SonB : BaseA { public string b = "bb"; public override void Show() { MessageBox.Sho...原创 2021-02-15 18:47:20 · 571 阅读 · 0 评论 -
对线程与进程的区别以及对多线程并发的理解
一、线程与进程的区别先简单说说线程与进程的概念:(1)进程是指一个内存中运行的应用程序,比如在Windows系统中,一个运行的exe就是一个进程。(2)线程是指进程中的一个执行流程。区别:一个程序至少有一个进程,而一个进程至少有一个线程。一个应用程序可以同时启动多个进程。例如对于IE浏览器程序,每打开一个IE浏览器窗口,就启动了一个新的进程。而线程则是指进程中的一个执行流程,一个进程可以有多个线程,每个线程分别执行不同的任务,当进程内的多个线程同时运行时,这种运行方式就被称为并发运行。原创 2020-10-13 21:46:07 · 1730 阅读 · 0 评论 -
C# override详解
重载、重写、覆写,分别指的是overload、override、new。一、override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现。提供从基类继承的成员的新实现,而通过override声明重写的方法称为基方法。注意事项:1.重写基方法必须具有与override方法相同的签名。2.override声明不能更改virtual方法的可访问性,且override方法与virtual方法必须具有相同级别原创 2020-06-14 20:27:15 · 16491 阅读 · 0 评论 -
动态存储和静态存储区域区别
动态存储方式所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。静态存储方式所谓静态存储方式是原创 2016-04-21 09:52:29 · 13829 阅读 · 0 评论 -
WinForm 之Control.Invoke 和Control.BeginInvoke 方法的使用 Control 不能在创建它的 Thread 之外被调用。但可以通过 invoke 来保证 C
WinForm 之Control.Invoke 和Control.BeginInvoke 方法的使用Control 不能在创建它的 Thread 之外被调用。但可以通过 invoke 来保证 Control 线程安全。在跨线程更新的时候,Control 会检查 CurrentThread 是否为创建 Control 的线程,并报错!示例代码如下: 示例代码转载 2017-10-26 21:30:29 · 513 阅读 · 0 评论 -
句柄概念
句柄(handle),有多种意义,其中第一种是指程序设计,第二种是指Windows编程。现在大部分都是指程序设计/程序开发这类。第一种解释:句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。第二种解释:整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应转载 2017-12-20 11:53:55 · 4339 阅读 · 1 评论 -
在C++里,有两种方法创建对象:
方法一:ClassName object(param);这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享。例如,我定义了一个这样的类:class Rec原创 2016-08-29 21:40:48 · 729 阅读 · 0 评论 -
C/C++中函数参数传递
昨天看了内存管理的有关内容,有一点了解,但不是很深入,发现之前写代码时有很多细节问题没有注意到,只知道这样做可以实现功能,却不知道为什么可以这样,对于采用自己的方法造成的隐患也未知,更不晓得还有其他方法可以实现,我们知道C++强大的一个原因是因为对于一个问题的答案多种解答方法或思路,我想着也许就是它难学的原因。因为你只知道一种或极少数的实现方法,却不知道其他的实现方法,换句话说,就是对这个东西很掌转载 2017-12-28 15:37:57 · 705 阅读 · 0 评论 -
C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域。数据段属于静态内存分配。 代码段: 代码段(code segment/t转载 2017-12-28 16:05:42 · 2527 阅读 · 0 评论 -
c# 窗口句柄问题 。
1、如何获得一个窗口的句柄? 例如获取窗口PictureBox控件(其他控件也可以)的句柄,[csharp] view plain copyIntPtr handle = pictureBox.Handle; 2、注意:窗口创建和窗口创建完毕即有句柄完全是两回事!!! 窗口创建时,窗口并没有创建句柄,只有Ap转载 2017-12-28 16:35:48 · 5458 阅读 · 0 评论 -
c#中已知一个外部窗口的句柄,怎么关闭
已知一个外部窗口的句柄,怎么关闭它。怎么给这个窗口的一个文本框设置内容。 c#已知一个外部窗口的句柄,怎么关闭它。怎么给这个窗口的一个文本框设置内容。本文地址 :CodeGo.net/1079020/ ---------------------------------------------------------------------------------------转载 2017-12-28 17:08:43 · 3138 阅读 · 0 评论 -
虚拟内存解疑
虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存[2] 技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows转载 2018-03-24 14:56:45 · 463 阅读 · 0 评论 -
windows内存结构概述
13.1 Windows的虚拟地址空间安排13.1.1虚拟地址空间的分区(即虚拟地址空间布局) 进程的地址空间划分分区x86 32位Windows3GB用户模式下的x8632位WindowsX64 64位WindowsIA-64 64位Windows空指针赋值区转载 2018-03-24 15:03:22 · 3984 阅读 · 0 评论 -
C#接口中为什么不能像java那样使用static?
我印象中java里面的接口使用static final修饰的常量,不是成员方法,使用static修饰的method放在接口中是无意义的,接口是用来抽象的。。。。与Java不同,C#中的接口不能包含域(Field)。另外还要注意,在C#中,显式为接口的方法指定public修饰符是非法的。综上,所以c#接口中不允许使用static~~因为他的接口中没有field这个概念,与java不同,而java...转载 2018-12-28 16:04:29 · 676 阅读 · 0 评论 -
通过点击事件监听 setOnClickListener 彻底理解回调-Android
前言老司机们对于回调肯定熟悉得不能再熟悉了,但是新司机可能还是一脸懵逼的,我比较笨,当年懵逼了好久,看夏安明的这一篇博客地址,虽然下边的留言都是,写得好!懂了懂了!但是我当时看了三遍还是不懂好吗 - -,现在我站在我的角度,用我理解的方式给大家讲解回调,我这么笨都理解了,聪明的新司机们肯定也是可以的setOnClickListener 分析setOnCLickLinstener,只要写...转载 2018-12-28 16:42:37 · 5778 阅读 · 1 评论 -
c++中LPCTSTR,LPTSTR 解释
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。Windows为了消除各编译器的差别,重新定义了一些数据类型,你提到了另外几个类型都是这样。CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。它实际定义在<string.h>里: typedef unsigned short wchar_t。下面在看...转载 2019-02-15 11:49:39 · 23687 阅读 · 1 评论 -
c++中sscanf的用法
sscanf 读取格式化的字符串中的数据。swscanf 是 sscanf 的宽字符版本;swscanf 的参数是宽字符串。 swscanf不处理 Unicode 全角十六进制或"兼容性区"字符。 除此以外,swscanf 和 sscanf 的行为完全相同。函数语法 1 int sscanf( const char *buffer, cons...转载 2019-02-15 14:14:30 · 7309 阅读 · 0 评论 -
指针强制转换问题
void ff(void* abc)//任意类型数据指针(指针即内存地址) { int* z = (int*)abc;//强制转换成int* 指针变量 int zz = *z;//获取内存中的值 }...原创 2019-02-26 11:56:47 · 489 阅读 · 0 评论 -
Marshal在C#中的应用(void *指针到IntPtr的转化)
C#调用C语言的API时一般把void *指针转换成IntPtr,但这经常远远不够的。在C语言中void *是个万金油,尤其是一些老的c语言程序,所有的参数就一个void*指针,里面包罗万象,然后在程序中来一个switch,甚至多个switch来处理不同的参数。最近笔者就碰到了这个问题,不得不来研究一下怎么把void *指针转换成IntPtr。1.void *指针到IntPtr的简单转化。...转载 2019-03-06 10:11:21 · 5180 阅读 · 0 评论 -
用汇编的眼光看C++(之拷贝、赋值函数)
拷贝构造函数和复制函数是类里面比较重要的两个函数。两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义:[cpp] view plain copyclass apple { public: apple() { printf("apple()!\n");} apple(app转载 2017-10-26 21:28:28 · 326 阅读 · 0 评论 -
C# 理解lock
一. 为什么要lock,lock了什么?当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性。lock是C#中最常用的同步方式,格式为lock(objec转载 2017-10-29 19:54:56 · 362 阅读 · 0 评论 -
C++函数声明和定义
在上一节,我们已经学会了如何阅读函数原型和如何调用一个函数。然而,仅靠系统给出的标准库函数是不够用的。我们有时候要根据我们的实际要求,写出一个合适自己使用的函数。那么,我们如何来自己动手编写一个函数呢?首先,我们要告诉电脑,我们自己编写了一个函数,即这个函数是存在的,这叫作函数的声明(Declaration)。其次,我们要告诉电脑这个函数是怎么运作的,这叫作函数的定义(Definiti转载 2016-04-12 11:06:44 · 5696 阅读 · 0 评论 -
C++中头文件(.h)和源文件(.cpp)都应该写些什么
头文件(.h): 写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。 在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下): #ifndef CIRCLE_H#define CIRCLE_H//你的代码写在这里#endif 这样做是为了原创 2016-04-12 11:31:27 · 1604 阅读 · 0 评论