C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型

在C#中,存在两个泛型修饰符:in和out,他们分别对应逆变委托和协变委托。

我们知道,在C#中要想将一个泛型对象转换为另一个泛型对象时,必须要将一个泛型对象拆箱,对元素进行显式或隐式转换后重新装箱。

例如:

List<Object> lobject=new List<Object>(){"0","1","2"};
List<int> lint=new List<int>();
foreach(Object obj in lobject)
{
  lint.Add((int)obj);
}

在这个拆箱和装箱的过程中,要消耗掉相当于lobject对象两倍的内存和资源,如果lobject对象非常大,这将是非常巨大的资源消耗。泛型修饰符就是用来解决这个问题的。
当两个泛型对象的元素存在继承关系是,可以在实现泛型对象是为泛型元素增加in或者out声明,以便逆变或协变。

逆变泛型:

ListIn:IList<in T>
ListIn<Object> lobject = new ListIn<Object>(){"0","1","2"};
ListIn<int> lint=new ListIn<int>;
lint = lobject;

---------------------

协变泛型:

ListOut:IList<out T>
ListOut<int> lint=new ListOut<int>(){0,1,2};
ListOut<Object> lobject=new ListOut<Object>();
lobject=lint;

转自:https://blog.csdn.net/mykge/article/details/42918841

原文地址:https://www.cnblogs.com/evemen/p/10199625.html

时间: 2024-10-13 06:59:38

C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型的相关文章

C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换掉. 首先我们要明白,泛型是泛型,集合是集合,泛型集合就是带泛型的集合.下面我们来模仿这List集合看一下下面这个例子: 我们的目的是要写一个可以存放任何动物的集合,首先抽象出一个动物类: //动物类 public class Animal { //随便定义出一个属性和方法 public Strin

学习C#修饰符:类修饰符和成员修饰符

C#修饰符之类修饰符:public.internal. partial.abstract.sealed.static C#修饰符之成员修饰符:public.protected.private.internal.sealed.abstract.virtual.override.readonly.const Public:最开放,所有的本程序集以及其他的程序集里面的对象都能够访问 Protected:比较开放,自身成员以及子类成员可访问 Private:只有自身成员才能够访问 Internal:本程

C#学习笔记---修饰符,this关键字和static关键字

1.  C#中类的修饰符: public 表示不限制对该类的访问  protected 表示只能从所在类和所在类派生的子类进行访问    private 只有其所在类才能访问 internal 只有对用一个包中的应用程序或库才能访问  abstract 抽象类不允许建立类的实例 sealed 密封类不允许被继承 与Java相比,protected修饰符的定义有所改变.C#中增加的internal,类似于Java中protected的定义.sealed修饰符类似Java中final class的定

协变、逆变与不变:数组、泛型、与返回类型

转自:http://blog.csdn.net/yi_Afly/article/details/52071260 1. 前言 之前几篇博文,有些地方涉及到了协变性.逆变性与不变性在Java中的表现,所以这篇博文将重点记录这方面的内容,并辅以JDK源码中的一些实例,加以说明. 2. 定义 这里讨论的协变.逆变与不变都是编程语言中的概念.下面介绍定义: 若类A是类B的子类,则记作A ≦ B.设有变换f(),若: 当A ≦ B时,有f(A)≦ f(B),则称变换f()具有协变性. 当A ≦ B时,有f

C#语言中的修饰符汇总

1. 访问修饰符 指定声明的类型和类型成员的可访问性. (1) public:对任何类和成员都公开, 无限制访问;是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. (2) private:仅仅对该类公开;是一个成员访问修饰符.私有访问是允许的最低访问级别.私有成员只有在声明它们的类和结 构体中才是可访问的. (3) internal:只能值包含该类的程序集中访问该类(只是单独的项目,而不是整个解决方案);是类型和类型成员的访问修饰符.只有在同一程序集的文件中,

简述public private protected internal修饰符的访问权限

public 关键字是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. protected 关键字是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问.有关 protected 与其他访问修饰符的比较,仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的. internal 关键字是类型和类型成员的访问修饰符.只有在同一程序集的文件中,内部类型或成员才是可访问的. private 关键字是一个成员访问修饰符.私有访问是允许的最低访问

C#继承机制 继承与访问修饰符

继承与访问修饰符 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性.类的继承中有四个访问修饰符: public protected internal private.使用这些访问修饰符可指定下列五个可访问性级别: public protected internal internal protected private. 1.继承中关于可访问域的一些问题 基类的所有成员(实例构造函数.析构函数和静态构造函数除外)都由派生类型继承.这甚至包括基类的私有成员.但是,私有成员的可访问域只包括声

c# 泛型协变逆变学习

最近在项目开发当中使用泛型委托Func较多,查看Func的定义就会发现Func的入参都会都会标记上in,出参都会标记上out. in 和out和泛型类型实参有关, 其中in代表逆变,out代表协变.自己协变和逆变在设计接口或者委托的时候也没有定义过, 因此就详细了解一下其用法. 一.关于协变和逆变 在c# 4.0后,泛型类型参数分为以下三种请情况 1.不变量   这带便泛型参数类型参数不能更改 2.协变量  泛型类型参数可以从一个类更改为它的某个基类.c#中使用out关键字标记协变量形式的泛型类

厘清泛型参数的协变与逆变

协变与逆变(CoVariant and ContraVariant),很多人是糊涂的,我也一直糊涂.其实,对协变与逆变概念糊涂,甚至完全不知道,对一般程序员也没有很大影响.不过,如果你想提高水平,想大概看懂.Net Framework类库中那些泛型接口与泛型类,想大概弄清楚Linq,这个概念还是需要搞清楚. 话又说回来,想弄清楚,其实还是挺费劲的. 如果你还糊涂着这两个概念,相信我,认真看完下面的文字,你会对泛型参数的协变与逆变有一个清晰的理解. 想透彻掌握协变.逆变的概念,首先需要对接口.委托