![](https://img-blog.csdnimg.cn/20181130153612958.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C#高级编程
泛型与集合、委托编程实例与解析
number1killer
软件测试
展开
-
Control.Enter Event 与Control.Click Event
本文部分资料摘自书籍和官网,由number1killer翻译、整理。Control.GotFocus Eventhttps://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.gotfocus?view=netframework-4.8https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.control.gotfocus?view=netf翻译 2020-08-28 10:27:11 · 189 阅读 · 0 评论 -
基类与派生类的类型关系以及this关键字(C#)
原创 2020-05-28 16:41:04 · 385 阅读 · 0 评论 -
Using指令的3种用法实例解析
本文部分内容来源于书籍和网摘。1、 uisng指令允许在命名空间中使用类型,这样就无需在该命名空间中指明(限定)该类型是谁的成员。2、 允许访问类型的静态成员和嵌套类型,而无需限定使用类型名称进行访问。3、 using别名指令...原创 2019-03-05 18:30:01 · 626 阅读 · 0 评论 -
C# 自定义命名空间实例解析
本文部分内容来源于书籍和网摘。namespace 关键字用于声明包含一组相关对象的“作用域”。可以使用命名空间来“组织代码元素”并“创建全局唯一类型”。命名空间用于组织、重用代码。使得代码更加结构化,重用更加便捷。//private namespace nameSpaceSimpleXXX///命名空间的声明中不能包含修饰符或特性 修饰符用于修改类型和类型成员的声明。//...原创 2019-03-04 11:33:47 · 1035 阅读 · 0 评论 -
C# find方法、findLast方法、findAll方法实例解析
本文部分内容来源于书籍和网摘。List<T>.Find(Predicate<T>) Method 命名空间:System.Collections.Generic 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中的第一个匹配元素。 List<T>.FindAll(Predicate<T>) Method检索...原创 2019-01-15 16:43:21 · 10121 阅读 · 0 评论 -
Yield return语句与return语句的4个不同点(下)
3、return语句的返回值类型取决于方法的返回类型,如果方法是 void 类型,则 return 语句可以省略;而yield语句的返回值类型返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。4、可以在Main()方法中使用return语句返回与Main()方法返回类型相同的数据,这和普通的方...原创 2019-01-10 17:56:23 · 563 阅读 · 0 评论 -
foreach 语句的使用限制与解决方案
所以,不具备公共 GetEnumerator 方法的类型是无法使用foreach来进行遍历的。先来看看官网上的说明:foreach语句可应用于满足以下条件的任何类型的实例:具有公共无参数 GetEnumerator 方法,其返回类型为类、结构或接口类型。 GetEnumerator 方法的返回类型具有公共 Current 属性和公共无参数 MoveNext 方法(其返回类型为 Boo...原创 2019-01-09 12:45:05 · 1288 阅读 · 0 评论 -
IEnumerator接口成员工作流程
本文部分内容来源于书籍和网摘。IEnumerator接口支持对非泛型集合的简单迭代。IEnumerator 是所有非泛型枚举器的基接口。 其泛型等效项是System.Collections.Generic.IEnumerator<T>接口。枚举器可用于读取集合中的数据,但不能用于修改基础集合。 ...原创 2019-01-07 11:55:44 · 291 阅读 · 0 评论 -
Yield return语句与return语句的4个不同点(上)
本文部分内容来源于书籍和网摘。return语句返回的是其所在方法的控制权,即终止该方法的此次执行;而迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。2、可以在同一个方法中同时使用多个yield return语句,同时返回多个值; 但是不能在同一个方法中用return语句同时...原创 2019-01-02 12:10:50 · 466 阅读 · 0 评论 -
C#由“隐藏条件”导致的排序结果不同
我们可以看到Array.Sort()的排序结果是“错误”的,但是Sort()方法的排序结果则是正确的。咋看之下,似乎是Array.Sort()方法不适合用作string类型元素的排序。但实际上则是由于 " my"之中多了一个空格引起的,去掉空格之后两者的排序结果其实是相同的。...原创 2018-12-19 12:01:39 · 296 阅读 · 0 评论 -
C# Dictionary(Tkey,TValue)集合类解析与实例
本文部分注释部分来源于书籍和官网网摘。Dictionary<Tkey,TValue>类在内部维护两个数组。一个存储要从其映射的键,另一个存储映射到的值。因此,其他语言一般把这称为关联数组。 Dictionary<Tkey,TValue>类表示键和值的集合。类型参数:TKey字典中的键的类型。 TValue字典中的值的类型。...原创 2018-10-05 17:41:01 · 1646 阅读 · 0 评论 -
C# SortedList(Tkey,TValue)集合类解析与实例
SortedList<TKey,TValue>类表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。 SortedList<TKey,TValue>和 Dictionary<Tkey,TValue>类很类似,都允许将键和值关联。主要区别是,前者的键数组总是排好序的(不然也不会叫SortedList了)。在 SortedList<TKey,TVa...原创 2018-10-05 17:43:43 · 1398 阅读 · 4 评论 -
C# List<T>集合类解析与实例
本文部分注释部分来源于书籍和官网网摘。命名空间:System.Collections.Generic表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。...原创 2018-10-04 11:37:58 · 1750 阅读 · 1 评论 -
C# LinkedList<T>集合类解析与实例
本文部分注释部分来源于书籍和官网网摘。LinkedList<T> 是一个通用的链接的列表。 它支持枚举器和实现ICollection接口,与.NET Framework 中的其他集合类保持一致。 LinkedList<T> 提供类型的单独节点LinkedListNode<T>,因此插入和删除是 o (1) 的操作。...原创 2018-10-04 11:40:18 · 2332 阅读 · 0 评论 -
var类型变量(隐式类型的局部强类型变量)
从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。...原创 2018-12-18 11:02:40 · 597 阅读 · 0 评论 -
C#泛型性能之List<T>列表与数组的排序性能差异
本文部分注解部分来源于书籍和官网网摘。装箱 和 拆箱 會影響性能能。但是,在编译时没有办法告诉我们列表中数据的实际类型是什么。这使得一些代码变得脆弱。泛型通过提供额外的信息来解决这个问题,每个列表中包含的数据类型将包含在内。 这里首先要注意的是,对泛型列表进行排序要比对非泛型列表要快。...原创 2018-12-14 12:03:03 · 1565 阅读 · 0 评论 -
C#用foreach语句输出泛型列表List<T>、非泛型列表ArrayList、数组的性能对比
不难看出用foreach遍历相同数据类型不同列表的元素,数组类型都是最快的;且不论是哪种类型的列表foreach对object型元素的遍历速度都是最快的(foreach就是通过迭代变量来引用迭代器中的元素的)。 ...原创 2018-09-07 11:29:53 · 1559 阅读 · 0 评论 -
C# foreach(迭代语句标识符)语句译文上
foreach语句语法: foreach_statement foreach语句 局部变量类型 标识符 in 表达式(例如:数组对象) : 'foreach' '(' local_variable_type identifier 'in' expression ')' embedded_statement 嵌入式语句;The ...翻译 2018-09-07 11:25:49 · 335 阅读 · 0 评论 -
C# String类笔记
The category of a character or a surrogate pair can be determined by calling the CharUnicodeInfo.GetUnicodeCategory method.可以通过调用CharUnicodeInfo.GetUnicodeCategory方法来确定字符或配对的代理的类别。 即字符串实际上就是一种异构集合,而...原创 2018-09-03 18:09:48 · 300 阅读 · 0 评论 -
泛型笔记之类型模板及其局限性
泛型本质上是「代码类型样版」,可讓開發人員定義类型安全性(在C#的程序中拆装箱和强制类型转换越少,其类型安全性越高)数据結構, 而不需要指定實際数据類型。 泛型将类型参数的概念引入 .NET Framework,使得我们可以这样设计类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型。 //因为不能直接对泛型类型的数据使用运算相加的操作,所以编译器输出了“未...原创 2018-08-27 13:54:29 · 239 阅读 · 0 评论 -
泛型性能之List<T>列表与非泛型列表ArrayList排序
ArrayList类被设计用于操控(hold,控制)对象的异构集合。通过对比,我们不难发现:对值类型的元素进行排序,List<T>明显更快;而对于引用类型的元素进行排序,则是ArrayList明显更快。但是并不是对所有的泛型列表进行排序都比非泛型列表更快的,本文主要就是讨论这个问题(本文部分文本摘自官网)。...原创 2018-08-28 18:04:55 · 418 阅读 · 6 评论 -
C#泛型列表List<T>、非泛型列表ArrayList、数组的排序性能对比
对值类型的元素进行排序:速度最慢的是ArrayList、其次是数组,速度最快的是List<T>;对引用类型的元素进行排序:速度最慢的是数组、其次是List<T>,速度最快的是ArrayList....原创 2018-09-11 12:01:53 · 850 阅读 · 0 评论 -
C#逆变接口实例和解析
ContraVarianceBody.inInterface<string> Instr = ObjClass;//逆变性 Console.WriteLine(Instr.outMethod("getIt"));//逆变接口常常用于获取数据并处理、转化成指定的类型 //协变接口常常用于返回、输出各种类型的数据...原创 2018-12-11 17:53:25 · 317 阅读 · 2 评论 -
C#协变接口实例与解析
本文部分说明来自书籍和网摘。接口成员实例化之后该接口成员的“返回值类型”和“参数类型”不能改变的接口,称之为不变量(接口中的)。其他常见的不变量还有常量(即常数)、const静态字段(即const静态变量)等。不能将不变量接口的(引用)对象赋给任何其他接口的(引用)对象。也就是说泛型不变量接口其实就是一种“普通”的接口,只不过加了一个泛型类型参数。协变和逆变正是建立在“不变”的...原创 2018-09-25 12:42:09 · 411 阅读 · 0 评论 -
C#泛型接口中的不变量
本文部分说明来自书籍和网摘。接口成员实例化之后该接口成员的“返回值类型”和“参数类型”不能改变的接口,称之为不变量(接口中的)。其他常见的不变量还有常量(即常数)、const静态字段(即const静态变量)等。不能将不变量接口的(引用)对象赋给任何其他接口的(引用)对象。也就是说泛型不变量接口其实就是一种“普通”的接口,只不过加了一个泛型类型参数。协变和逆变正是建立在“不变”的...原创 2018-09-21 12:12:58 · 407 阅读 · 0 评论 -
二叉树之3结点定向树
如果两棵树的差别仅仅只是各自结点子树的次序不同时就不作区分,则称这样的树是定向的(oriented),因为我们只考虑结点的相对定向(将这样的二叉树视为以结点位导向的树,即只关心结点的次序,而不关心子树的次序),而不是子树的次序。 二叉树二叉树是每个结点最多有两个子树的树结构。 子树子树就是结点的分支。 结点分支的结合点称为结点。...原创 2018-11-12 17:33:35 · 198 阅读 · 0 评论 -
二叉树之4结点定向树
如果两棵树的差别仅仅只是各自结点子树的次序不同时就不作区分,则称这样的树是定向的(oriented),因为我们只考虑结点的相对定向(将这样的二叉树视为以结点位导向的树,即只关心结点的次序,而不关心子树的次序),而不是子树的次序。 二叉树二叉树是每个结点最多有两个子树的树结构。 子树子树就是结点的分支。 结点分支的结合点称为结点。...原创 2018-11-12 17:37:40 · 525 阅读 · 0 评论 -
协变接口与逆变接口的4个不同点
隐式转换的范围不同协变接口:可以将“类型范围”比他更小的引用对象(实现了该接口的类的对象而非接口类型的对象)赋给协变接口的引用对象。逆变接口:可以将“类型范围”比他更大的引用对象(实现了该接口的类的对象而非接口类型的对象)赋给逆变接口的引用对象。对象。...原创 2018-12-07 17:46:56 · 299 阅读 · 0 评论 -
C#栈(后进先出)队列实现与解析
本文部分注释部分来源于书籍和官网网摘。Stack<>集合类实现了【后入先出的栈】(也是一种线性表),所有的插入(push)和删除(pop)(通常还有所有的访问)都在顶部进行。Queue<>集合类实现了【先入先出队列】(也是一种线性表),所有的插入(Enqueue)都在队列(表)的队列最末端 进行,所有删除(Dequeue(),通常还有所有的访问)都在队列(表)的队...原创 2018-10-05 11:49:52 · 3810 阅读 · 0 评论 -
泛型方法的设计与应用2(参数的限制与设计)
设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,则必须对该类型参数应用约束。包括但不仅限于:由于具体类型的参数可能无法用于实现方法所以对泛型方法的参数进行限制: 由于具体的参数值可能不符合方法对参数的(数值大小、字符串长度等)要求所以对泛型方法的参数进行限制(这个相信大家都懂)。 ...原创 2018-12-04 09:52:44 · 260 阅读 · 0 评论 -
泛型方法的设计与应用1(静态与引用类型的设计)
可以通过,泛型类的类型参数的实例类型来指定泛型方法的实例返回值类型,从而实现引用类型泛型方法的调用。之前在《C#泛型方法和普通方法的性能实例解析》一文中,演示和解析了泛型方法的一些强大的性能。现在让我们再一起来回顾一下:强类型的元素也可以理解为”更早识别类型”。而这也是称之为强类型的原因,因为在编译时没有办法告诉我们列表中(元素)数据的实际类型是什么,泛型通过提供额外的信息来解...原创 2018-12-03 11:27:53 · 207 阅读 · 0 评论 -
C# Queue<T>集合类(先进先出队列)解析与实例
Queue<T>Class 表示对象的先进先出(FIFO)集合。使用Queue<T>如果需要访问存储在集合中的相同顺序(进出同序)中的信息。 使用Stack<T>如果你需要按 后进先出(LIFO)的顺序访问的信息。使用ConcurrentQueue<T>或ConcurrentStack<T>如果你需要同时从多个线程访问...原创 2018-10-04 17:56:24 · 10794 阅读 · 0 评论 -
HashSet类求集合与集合之间是否为真子集或真超集
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 /// ...原创 2018-11-23 17:18:03 · 863 阅读 · 0 评论 -
HashSet类求集合与集合之间是否为子集或超集
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 /// ...原创 2018-11-23 17:15:12 · 417 阅读 · 0 评论 -
C# HashSet<T>类3个破坏性方法实例解析
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 我们知道...原创 2018-11-22 17:04:09 · 980 阅读 · 0 评论 -
C# HashSet<T>类UnionWith()方法实例解析
本文部分资料来源于书籍和网摘HashSet<T>类专为集合操作优化,包括判断数据项是否集合成员、生成合并集、交集等。/// UnionWith方法:修改当前 HashSet<T> 对象以使其包含存在于该对象中、指定集合中或两者中的所有元素。/// 这种操作是破坏性的,因为该方法会用一个 “新集合” 覆盖 “原始” HashSet<T> 对象的内容。...原创 2018-11-21 17:53:06 · 3278 阅读 · 2 评论 -
C# HashSet<T>类IntersectWith()方法、Add()方法实例解析
本文部分资料来源于书籍和网摘/// HashSet<T>类专为集合操作优化,包括判断数据项是否集合成员、生成合并集、交集等。/// IntersectWith方法:“修改”当前的 HashSet<T> 对象,以使其仅包含该对象和指定集合中存在的元素。/// 这种操作是破坏性的,因为该方法会用一个 “新集合” 覆盖 “原始” HashSet<T> 对象...原创 2018-11-21 17:48:22 · 2683 阅读 · 0 评论 -
C# HashSet<T>类中增、删、清除方法(Add、Remove、Clear)实例解析
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 我们知道...原创 2018-11-22 17:06:56 · 4795 阅读 · 0 评论 -
C#泛型委托实例
本文部分注释部分来源于书籍和官网网摘。 委托可以定义它自己的类型参数。 Generic delegates are especially useful in defining events based on the typical design pattern because the sender argument can be strongly typed and no longer h...原创 2018-10-04 11:34:08 · 1175 阅读 · 0 评论 -
C#用委托来拓展计算器的功能实例
委托使得不需要调用方法的标识符来调用方法,使得程序具有更好的封装性和安全性委托的多播使得程序具有更好的拓展性下面一起来一个实例:委托使得不需要调用方法的标识符来调用方法,使得程序具有更好的封装性和安全性委托的多播使得程序具有更好的拓展性Console.WriteLine("使用委托来计算(a+b)(a+b)b:");Console.WriteLine("使用委托来计...原创 2018-07-27 12:36:44 · 1130 阅读 · 0 评论