C#中的泛型

、泛型

在C#中可以用<>占位符,来进行类型占位。由于泛型占位在编译之后就会被替换成对应的类型,所有可以重用,比object性能要好很多。但有一个不算太大的缺点:泛型占位在编译时必须确定类型(传入或编译器推断)。

泛型类  1.1 泛型类中占位符的几种约束

a.基类约束 pulic class Hourse<T> where T:Pig 只能传入Pig类型             b.接口约束 pulic class Hourse1<T> where T:IPig 只能传入实现了IPig接口的类型             c.引用类型约束 pulic class Hourse2<T> where T:class 只能传入引用类  型             d.值类型约束 pulic class Hourse3<T> where T:struct 只能传入值类型             f.构造器约束 pulic class Hourse4<T> where T:new() 只能传入能被new  ()的类型  pulic class Hourse5<T> where T:class,new()     -class关键字必须在  前面 。这种方式只能传入能被new()的引用类型              多个占位符的约束写法: 每一个约束用一个where 开头。例:          pulic class Hourse6<T,V> where V:struct where T:class           1.2 泛型类的继承        a.非泛型类继承泛型类:              必须指定具体的父类占位符类型 public class Son:Person<string,int>         b.泛型类继承泛型类:             如果子类要将站位符传给父类,则必须与父类的约束保持一致            pulic class Son2<X,Y>:Person<X,Y>占位符类型,此时子类可以不加约束                      如果子类不传递占位符,那么必须为父类指定具体的              pulic calss Son3<X,Y>:Person<string,int>   1.3 封闭类型和开放类型的概念      编码时mylist<T> 是开发类型,运行时产生的具体类是封闭类型  自己实现的泛型类 ---》开放类型 ,可以更改          程序运行时生成的泛型类--》封闭类型,不可改       泛型方法         位置:泛型方法的类型参数,可以在该方法的 形参,方法体,返回值   1、泛型方法的占位符的

2、泛型方法的重载条件               a.参数个数不一致  b.参数类型不一致(形参非泛型部分)c.方法类型占位符个数不一致   3、泛型方法的重写,注意不需要重写约束条件 ,默认会自己添加

协变和逆变    只能用于泛型接口和泛型委托

协变: out  ->代表当前占位符只能当做返回类型,不能当做入参类型 逆变: in   ->代表当前占位符只能当做入参类型,不能当做返回类型

时间: 2024-10-09 05:02:53

C#中的泛型的相关文章

构造方法中使用泛型

------------siwuxie095 构造方法中使用泛型: 构造方法可以为类中的属性初始化,如果类中的属性通过泛型指定,而又需要 通过构造方法设置属性内容的时候,构造方法的定义与之前并无不同,不需要 像声明类那样指定泛型 package com.siwuxie095.generic; class Context<T>{ private T value; public Context(T value) { this.value=value; } public T getValue() {

泛型及java中的泛型

当作笔记整理的~~~ 首先,引出堆对象这个概念. 什么是堆对象,就是程序在运行过程中可以随时建立或者删除的对象,可以用new运算符(或malloc函数)或者delete运算符(或free函数).泛型可以看作是一类堆对象. 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明. 各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型. 泛型的定义主要有两种:1.在程序编

Java 中的泛型详解-Java编程思想

Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object

转载:C#中的泛型

泛型类和泛型方法兼复用性.类型安全和高效率于一身,是与之对应的非泛型的类和方法所不及.泛型广泛用于容器(collections)和对容器操作的方 法中..NET框架2.0的类库提供一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型的容器类.要查 找新的泛型容器类(collection classes)的示例代码,请参见基础类库中的泛型.当然,你也可以创建自己的泛型类和方法,以提供你自己的泛化的方案和设计模式,这是类型安全且高效 的.下面的示例代码以一

java中的泛型(转)

什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象. 因为 Map.get(

.net中的泛型

泛型把类或方法的类型的确定推迟到实例化该类或方法的时候 ,也就是说刚开始声明是不指定类型,等到要使用(实例化)时再指定类型 泛型可以用于  类.方法.委托.事件等 下面先写一个简单的泛型 public class GenericClass<T> { void SomeMethod( T t ) { //do something } } 其使用方法如下: 实例化一个类 ? 1 GenericClass<int> gci=new GenericClass<int>(); 方

Java中的泛型 (上) - 基本概念和原理

本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以深刻理解容器类.那,泛型到底是什么呢? 什么是泛型? 一个简单泛型类 我们通过一个简单的例子来说明泛型类的基本概念.实现原理和好处. 基本概念 我们直接来看代码: public class Pair<T> { T first; T second; public Pair(T first, T se

编写高质量代码改善C#程序的157个建议——建议43:让接口中的泛型参数支持协变

建议43:让接口中的泛型参数支持协变 除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary<out T> //使用out关键字 { void Pay(); } static void Main(string[] args) { ISalary<Programmer> s = new BaseSalaryCounter<Programmer>(); ISalary&l

ActionScript3.0(AS3)中的泛型数组Vector

Adobe官方并没有"泛型数组"的叫法,这是我自己对Vector的叫法(有点标题党),不过Vector在使用上确实跟c#中的泛型数组有些相似之处. 原作者:菩提树下的杨过出处:http://yjmyzz.cnblogs.com 我们知道:ActionScript3.0中的Array数组可以存放多种类型,甚至在同一个Array数组中,可以同时存入String,Object,Number...,但其实我们在实际开发中,通常一个数组中所保存的元素类型都是一致的,为了改进这种情况下的效率,AS

在集合中使用泛型

1 保证集合中元素类型的一致 package lianxi3; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Test; public class TestGeneric { @Test //在集合中使用泛型 pub