首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#2.0新增功能06 协变和逆变

这样,不仅可以具有匹配签名的方法分配给委托,还可以分配与委托类型指定的派生类型相比,返回派生程度更大的类型的方法(协变)接受具有派生程度更小的类型的参数的方法(逆变)。...Action del2 = SetObject; } 在 .NET Framework 4 较新的 C# 中,支持在接口和委托中使用协变和逆变,并允许隐式转换类型参数。...相关主题 Title 说明 接口中的变体 (C#) 讨论接口中的协变和逆变,提供 .NET Framework 中的变体接口列表。...委托中的变体 (C#) 讨论委托和非委托中的协变和逆变,并提供 .NET Framework 中的变体委托列表。...使用委托中的变体 (C#) 演示如何使用非委托中的协变和逆变支持以方法签名与委托类型相匹配。

1K10

聊聊C#中的的使用(新手勿入)

C#语言和公共语言运行库(CLR)中的一个新功能,它将类型参数的概念引入.NET Framework。...类型参数使得设计某些类和方法成为可能,例如,通过使用类型参数T,可以大大简化类型之间的强制转换装箱操作的过程(装箱、拆箱问题)。...TestClass 定义一个长度为5的类型数组。Add()方法负责任何类型的对象添加到集合中,而Indexer属性是循环语句迭代的实现。...,输出如下所示; [通用-Methods.jpg] 字典 字典也被称为映射列表。...在此程序中,创建一个Dictionary类型对象,该对象接受int作为键,字符串作为值。然后我们一些字符串值添加到字典集合中,最后显示字典集合元素。

1.7K40
您找到你想要的搜索结果了吗?
是的
没有找到

Unity 常用内容检索

---- 目录 代码 知识点 代码 字典Dictionary原理:传送门 使用方法:传送门 回调函数:传送门 (打ACM没用过这玩意儿,所以在Unity遇到的时候就放在这里补充一下) C#中问号(?)...的用法:传送门 :传送门 where约束:传送门 get set:传送门 ArrayList、List和Array的区别: 相同点 Array、ArrayList和List都是从IList派生出来的...2.数组可以是一维数组、二维数组和多维数组,而ArrayList List始终只具有一个维度。但是,可以轻松创建数组列表列表列表。...但是,如果对类型使用值类型,则需要考虑实现装箱和拆箱问题。 4.数组是抽象类不能被实例化,所有数组的定义都从它派生而来。 5.ArrayList是动态数组,可以自由伸缩数组的大小。...6.List是集合类型,并且是一个支持的集合类型。 ---- 知识点 对象交互三种方式:方法调用,委托回调,消息事件。 模块化方式:单例,IOC,分层(MVC,三层架构,领域启动分层等)

46810

C# 发展历史及版本新功能介绍

类型参数的概念引入 .NET Framework,这样就可以设计具有以下特征的类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个多个类型。...可以创建自己的接口、类、方法、事件和委托。 可以对类进行约束以访问特定数据类型的方法。 在数据类型中所用类型的信息可在运行时通过使用反射来获取。...通过,你获得可以对任意类型操作的类型和方法,同时保持类型安全性。...协变和逆变 协变和逆变都是术语,前者指能够使用比原始指定的派生类型派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型派生程度更小(不太具体的)的类型。...Contravariance 使你能够使用比原始指定的类型派生程度更小)的类型

4.2K20

.NET面试题系列 - IEnumerable的派生

当 .NET 引入支持后,类型安全的 Dictionary 类出现。...字典储存键值对,并依靠键的值直接找到对应的value。查找,插入,删除速度O(1)。字典的实现原理前面已经说过了,它和哈希表的实现原理有所不同,但它最大的优势还是在于。...IEnumerable的派生类:小结 访问方式 继承自 特点 IEnumerable 通过ElementAt 无 所有集合都继承自此接口 有非版本 提供遍历(通过GetEnumerator...有了版本的字典,我们几乎永远不需要使用非的HashTable。...C#大部分数据结构都实现了IEnumerable。 IEnumerable的派生类由于没有,所以基本不考虑使用。 字典,HashSet和哈希表(Hashtable)的实现有很大区别。

1.7K20

面向对象编程基础2(干货)

他是一种引用类型,可以通过对象和接口进行调用,虽然C#是单继承,但是却是多接口。 ? ? ?...概念4: 1.类:可理解为一个模子,装入类型的材料,就可以塑造出想要的产品。 2.语法展示: ? ? 3.使用的原因: ? 4.实例化过程 ?...6.方法:方法就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。(方法可存在于类和普通类中) 7.语法展示: ? ? ? 8.约束:约束就是控制的控制器。...9.接口:接口允许我们接口成员的参数和返回类型设置为参数的接口。 定义及实现: ? ? 概念5:集合 1.预定义常用的集合。...(目的:使得对象获得最大化的扩展) 5.集合 动态数组,列表字典;栈;队列 (目的:管理对象) 6.委托 委托;Lambda表达式;事件 -- (用于对象之间的通讯方式)

1.1K20

# C#学习--集合-堆栈-队列-哈希-字典

C#中的能够类型作为参数来传递,即在创建类型时用一个特定的符号如T来作为一个占位符,代替实际的类型,等待在实例化时再用一个实际的类型来代替: public static void Swap...降低强制转换装箱操作的成本和风险 可以对参数进行限定以访问特定数据类型的方法 方法 方法就是使用类型参数声明的方法,当方法中存在某些参数的类型不明确时候就可以使用方法。...**访问修饰符 返回值类型 方法名(参数列表){方法体}** void Test(T p1,U p2) { } 参数 参数可以有多个 类型参数可以是翻译器识别的任何数据类型...where T:U :为T提供的类型参数必须是为U提供的参数派生自为U提供的参数。...集合好比容器,一系列相似的组合一起,是一个特殊的类,和数组一样,可以通过索引访问集合成员,也可以通过”键”来访问,与传统数组不同的是,集合的大小可以动态调整,可以在运行时添加删除元素。

91020

C#4.0新增功能03 中的协变和逆变

此示例说明,只要所有委托类型都是从委托类型 Func构造的,就可以将此委托存储在具有派生程度更大的参数类型派生程度更小的返回类型的变量方法参数中。 这一点非常重要。....NET Framework 4 开始,Visual Basic 和 C# 提供了一些关键字,利用这些关键字,可以接口和委托的类型参数标记为协变逆变。...也可以逆变类型参数用作接口方法的类型约束。 只有接口类型和委托类型才能具有 Variant 类型参数。 接口委托类型可以同时具有协变和逆变类型参数。...Visual Basic 和 C# 不允许违反协变和逆变类型参数的使用规则,也不允许协变和逆变批注添加到接口和委托类型之外的类型参数中。...Variant 接口和委托类型列表 在 .NET Framework 4 中,下面的接口和委托类型具有协变和/逆变类型参数。

1.3K20

超硬核!苏州同程旅游学长给我的全面的面试知识库

列表涵盖了所有针对新生的C#问题以及针对经验丰富的应聘者的C#面试问题和答案。 ?...编译器方法的地址存储为入口点,并使用此信息在创建任何对象之前开始执行。Void是类型修饰符,它声明方法变量不返回任何值。 6、什么是物体? ?...17、 C#中的密封类是什么? 当我们想限制继承的类时,我们创建密封的类。密封的修饰符,用于防止从类派生。如果我们强制密封类指定为基类,则会发生编译时错误。 18、什么是方法重载?...循环引用是指两个多个资源相互依赖导致锁定条件并使资源无法使用的情况。 29、 C#.NET中的是什么? 用于制作可重用的代码类,以减少代码冗余,提高类型安全性和性能。...提倡使用参数化类型。 30、什么是.NET中的对象池? 对象池是具有准备使用的对象的容器。它跟踪当前正在使用的对象,池中的对象总数。这减少了创建和重新创建对象的开销。

3K20

浅谈

大多数算法都封装在一个类型中,CLR允许创建引用类型类型,以及接口和委托。所以CLR允许在类接口中定义方法。...来看一个简单例子,Framework类库定义了一个列表算法,它知道如何管理对象集合。算法没有设定数据的类型。要在使用这个列表算法时指定具体的数据类型。...使用类型并指定类型实参时,实际是在CLR中定义一个新的类型对象,新的类型对象从类型派生自的那个类型派生。...还提供更多对验证和约束的能力,编译代码时,C#编译器会进行分析,确保代码使用于当前已有将来可能定义的任何类型。...如果允许类型参数约束成具体的值类型,那么方法会被约束为只支持该具体的类型,这还不如不要呢!

1K30

【深入浅出C#】章节 5: 高级面向对象编程:编程和集合类型

的主要特点包括: 类型参数化:允许在定义时使用类型参数,这样可以具体的类型信息延迟到使用时确定,从而使代码更具通用性。...在C#中,常见的集合类型包括数组、列表字典、集合和队列等。 集合类型的作用包括: 存储和组织数据:集合类型提供了一种有效的方式来存储和组织大量数据,使其易于访问和管理。...以下是数组、列表字典、集合和队列的遍历和元素访问方法: 数组(Array): 遍历:使用for循环foreach循环遍历数组元素。...LINQ查询 4.1 迭代集合类型的方式和循环遍历 在C#中,可以使用不同的方式迭代和遍历集合类型,包括数组、列表字典、集合和队列。...类型和方法可以根据需要使用不同的数据类型,提高代码的灵活性和性能。 集合类型是存储和管理数据的容器,包括数组、列表字典、集合和队列等。

33121

.NET中的集合

各集合类底层接口关系图 与非集合类的分析 集合是类型安全的,基于固定的T,运行时不需要像非的执行Object和具体类型类型转换。 集合的效率相对较高。...两者都能实现数据存储,不同的是只能存放T类型数据,有运行时检测,而非的都转化为Object存储,能存储任意类型,包括值类型,会带来装箱拆箱的性能损耗,同时都是Object类型(弱类型)编译时无法类型检测...获取值可以通过索引器TryGetValue方法;与非IDictionary类型不同,如果试图用不存在的键获取值,IDictionary的索引器抛出一个KeyNotFoundException...派生类可以拦截这些方法,引发事件提供其他自定义行为。派生类可通过Items属性访问被包装的列表。如果该列表为只读,公共的变动方法抛出异常,而不再调用虚方法,你不必在覆盖的时候再次检查。...它们仍然实现了和非的集合接口。并且混合使用了显式和隐式的接口实现,这样使用具体类型的编译时表达式的调用者无法使用变动操作。

15620

Go 浅析

Go 浅析 程序设计(generic programming)是程序设计语言的一种风格范式。...Ada、Delphi、Eiffel、Java、C#、F#、Swift和Visual Basic .NET称之为(generics);ML、Scala和Haskell称之为参数多态(parametric...我们把一个型函数方法针对一组shape类型参数的实例化,称为shape实例化。 字典格式 字典是在编译阶段静态确定的,与型函数方法的调用以及调用时具体的类型实参相对应。...派生类型信息 这种情况所描述的,就是型函数方法中基于类型参数创建了新的类型,比如 *T、 []T和 map[K,V]等,并且我们需要用到这些派生类型的动态类型信息(类型元数据)。...4. itab区间 存在这个区间主要是因为,我们的型函数方法中,可能会存在从类型参数以及其派生类型到一种非空接口类型的转换,或者从一个非空接口到类型参数及其派生类型类型断言等。

46240

C#

(Generic) 是C# 2.0中的新增元素。这种机制允许类名作为参数传递给类型,并生成相应的对象。...(包括类、接口、方法等)看作模板可能更好理解,模板中的变体部分将被作为参数传进来的类名称所代替,从而得到一个新的类型定义。   通过可以定义类型安全类,而不会损害类型安全、性能工作效率。...可以创建集合类,来替代 System.Collections 中的集合类。   可以创建自己的接口、类、方法等。   可以对类进行约束以访问特定数据类型的方法。   ...在使用以前,我们要在程序的开头引入using System.Collections.Generic空间。 而在C#中Generic为我们提供的类型有List、Directory等。...List ----   List类表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。T为类型参数,代表列表中元素的类型

1.7K40

C#方法解析

定义类型方法时,为类型指定了任何变量(如:T)都称为类型参数。(T是一个变量名,在源代码中能够使用一个数据类型的任何位置,都可以使用T)在C#参数变量要么成为T,要么至少一大写T开头。...二.类、接口和委托概述:    1.类:     类型仍然是类型,所以可以从任何类型派生。...使用一个类型并指定类型实参时,实际是在CLR中定义一个新类型对象,新类型对象是从派生自的那个类型派生的。...C#编译器支持在调用一个方法时进行类型推断。执行类型推断时,C#使用变量的数据类型,而不是由变量引用的对象的实际类型。...以上的示例可以处理一个字符串列表,用一个转换器来生成一个Guid列表。   原始列表中的每个元素都转换成目标类型转换后的元素添加到一个列表中,最后返回这个列表

3.3K90

C#基础篇——

这样可以避免运行时类型转换封箱操作的代价和风险。提醒的是具体的东西模糊化。 同时使用类型可以最大限度地重用代码、保护类型安全以及提高性能。...在c#中,通过尖括号“”类型参数括起来,表示。声明接口时,与声明一般接口的唯一区别是增加了一个。一般来说,声明接口与声明非接口遵循相同的规则。...T: 类型参数必须是指定的基类派生自指定的基类。 T: 类型参数必须是指定的接口实现指定的接口。可以指定多个接口约束。约束接口也可以是的。...缓存比字典缓存效率高。缓存不能主动释放。...通常情况下,建议您使用集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。

1.3K40

快速入门系列--CLR--03集合

.NET中的集合 在这里主要介绍常见的集合,很多时候其并发时的线程安全性常常令我们担忧。因而简述下.NET并发时线程安全特性,其详情请见MSDN。...IList,提供定位功能,包括一个索引器、Insert和RemoveAt,我们通常认为可以通过索引对该集合进行随机访问。...接下来介绍具体的集合集合类型,在实际中需要根据具体场景选择最适合的集合类型。...与双向绑定相关的集合类型,注意它们只会在包装器发生变化发出通知,而基础列表改变时不会引发任何事件。...尤其在使用非线程安全的字典类进行并发操作时,有时会出现死循环等情形,尤其需要注意。 Tip:where T:new()  参考文献 Jon, Skeet. 深入理解C#(第3版)[M].

72970

.NET面试题系列 - IEnumerable的派生

IEnumerable分为两个版本:的和非的。IEnumerable只有一个方法GetEnumerator。...IDictionary的其中一个继承类Hashtable是一个非的集合。其储存着一系列的key Value键值对。这些数据都是Object类型的。...ArrayList派生自IList,所以其是一个非的集合。IList继承ICollection,同时,其增加了Add,Remove等方法。可以修改集合的内容。...IEnumerable的派生类:小结 访问特定位置的成员方式 继承自 特点 IEnumerable 通过ElementAt 无 有版本 提供遍历(通过GetEnumerator) 不能实例化(...dynamic sized,大小倍增 弱类型(所有的成员被视作object) 对应的版本为List 不使用 HashTable 键值对 IDictionary dynamic sized

81320

2022年Unity面试题分享

Array数组:需要声明长度,不安全 ArrayList数组列表:动态增加数组,不安全,实现了IList接口(表示可按照索引进行访问的非集合对象),Object数组实现 List列表:底层实现是数组...,特性,动态扩容,安全 数据(对值类型来说就是数据本身,对引用类型来说就是引用)存储在一个数组中,添加元素时若超过当前数组容量,则以2倍扩容,进而实现List大小动态可变。...链接: Dictionary实现原理资料. ---- 【重点面试题】32、是什么 多个代码对 【不同数据类型】 执行 【相同指令】的情况 :多个类型共享一组代码 允许类型参数化,类型类型的模板...5种:类、结构、接口、委托、方法 类型占位符 T 来表示 类不是实际的类,而是类的模板 从类型创建实例 声明类型》通过提供【真实类型】创建构造函数类型》从构造类型创建实例...类 类型参数 性能:不会强行对值类型进行装箱和拆箱,对引用类型进行向下强制类型转换,所以性能得到提高 安全:通过知道使用定义的变量的类型限制,编译器可以在一定程度上验证类型假设

3.8K10
领券