深入浅析C#泛型类型

上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型,

说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的只有一点点,因为后面要学习和掌握的知识还有很多。先来看下一个使用Dictionary<TKey,TValue>的例子。

static void Main(string[] args)
{
 Dictionary<int, string> result = GetAll();
}
public static Dictionary<int, string> GetAll()
{
  var dic = new Dictionary<int, string>();
 dic.Add(1, "aaa");
 dic.Add(1, "aaa");
 dic.Add(1, "aaa");
 return dic;
}

  泛型的两种形式:泛型类型(类、接口、委托和结构)和泛型方法,像TKey和TValue就是类型参数,而传入的int和string就是真实类型,可以看出类型参数只是真实类型的占位符。没有为类型参数提供真实参数的泛型叫做未构造泛型类型,如果指定了类型实参叫做已构造类型,而类型的实例才是我们使用到的对象。下图关系图。

  对于泛型的判断是一件让人头痛的事情,接下我们要好好说下,可能说得不是很清楚,尽力吧,因为书中说的我也不是很明白,先在这说明下。不清楚的话可以看看书中的解释。先看下图

  当我们看这样的泛型方法时,在实际使用中需要去替换里面的参数类型(前面也说过,参数类型其实是类型实参的占位符),使用string去替换T,使用int去替换TOutput  

 public static List<int> GetAll(Converter<string, int> conv)
 {
}

  其中Converter<string,int>是一个已构造类型,conv是一个形参,现在应该能知道这个泛型方法作用:使用一个Converter<string,int>泛型委托的实例作为参数,返回一个包含整型的的列表。

以上所述是小编给大家介绍的C#泛型类型,希望对大家有所帮助!

(0)

相关推荐

  • c# 泛型类型参数与约束的深入分析

    泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符.泛型类型参数放在"<>"内.泛型类型参数命名建议:(1)当泛型类型参数为单个字母时,建议用T表示.(2)当泛型类型参数用单词定义时,建议在单词前加T. 复制代码 代码如下: private void PromptName<T>(T t) {}private void PromptName<Tuser>(Tuser user){} 泛型类型参数

  • C# 泛型类(函数)的实例化小例子

    泛型可以用于类,也可以用于函数.如 泛型类: 复制代码 代码如下: public class MyClass<T> {     public T MyElement { get; set; } } 泛型函数: 复制代码 代码如下: public T ReturnElement<T>() {     throw new NotImplementedException(); } 但是当需要对MyElement进行实例化的时候,却不能使用new(),只要添加如下代码即可进行实例化了: 泛

  • C#泛型类创建与使用的方法

    本文实例为大家分享了C#泛型类创建与使用的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication13 { class Program { static void Main(string[] args) { Test<string,int> t = new Test<string,i

  • 介绍C# 泛型类在使用中约束

    首先看一下泛型的基本语法 访问修饰符 返回类型 泛型方法名 <T>(T 参数) 1):无法在泛型方法内部给任何 T 类型创建实例的对象,因为在泛型方法内部不知道传进来的对象有哪些构造函数2):约束是对内部的!(对于泛型方法)约束也是会被继承的! 3):给泛型类 加类型(引用类型,值类型)的约束:where T:class,new ( ) 遇到的问题:在写MongodbHelper类的时候,为了能处理多种类别,所以如下定义了该类: 复制代码 代码如下: public class MongodbH

  • 深入解析C#中的泛型类与泛型接口

    泛型类 泛型类封装不是特定于具体数据类型的操作.泛型类最常用于集合,如链接列表.哈希表.堆栈.队列.树等.像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关. 对于大多数需要集合类的方案,推荐的方法是使用 .NET Framework 类库中所提供的类. 一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,直至达到通用化和可用性的最佳平衡.创建您自己的泛型类时,需要特别注意以下事项: 将哪些类型通用化为类型参数. 通常,能够参数化的

  • 自定义的Troop<T>泛型类( c++, java和c#)的实现代码

    Troop<T>是一个泛型列表操作类,适用于非高性能和非大数据量的要求.包括了:取值get,赋值set,追加append,插入insert,清除remove,进队enqueue,出队dequeue,交换swap,滚动roll,进栈push,出栈pop等日常操作. //for more information, please access http://www.one-lab.net using System; using System.Collections.Generic; using Sy

  • 浅谈c# 泛型类的应用

    泛型类泛型类封装不是特定于具体数据类型的操作. 泛型类最常用于集合,如链接列表.哈希表.堆栈.队列.树等. 像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关.对大多集合类的操作,推荐使用 .NET Framework 类库中所提供的类.(1)泛型类可以继承具体类.封闭式构造.开放式构造基类. 复制代码 代码如下: class BaseNode { }class BaseNodeGeneric<T> { }// 继承具体类class NodeConcrete<

  • c#自定义泛型类的实现

    闲来无事,自己研究了泛型类的简单的使用,where表示泛型约束,表示泛型类型中的参数只能是car类型,IEnumerable是一个接口,一个集合要支持FOREAch遍历,必须实现IEnumerable接口 复制代码 代码如下: public class Car    {        public string PetName;        public int Speed;        public Car(string name, int currentSpeed)        {  

  • Java泛型类型通配符和C#对比分析

    c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,只是语法糖,在编译器编译的时候都转换成object类型 类型通配符在java中表示的是泛型类型的父类 public void test(List<Object> c) { for(int i = 0;i < c.size();i++) { System.out.println(c.get(i)); } } //创建一个List<String>对象 List<String&g

  • 深入浅析C#泛型类型

    上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型, 说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的只有一点点,因为后面要学习和掌握的知识还有很多.先来看下一个使用Dictionary<TKey,TValue>的例子. static void Main(string[] args) { Dictionary<int, string> result = GetAll(); }

  • Spring中RedisTemplate的基本使用浅析

    目录 spring-data-redis项目 使用步骤 spring-data-redis项目   spring-data-redis提供了在Spring应用中通过简单的配置访问redis服务,封装了 RedisTemplate 对象来对Redis进行各种操作.异常处理及序列化,支持发布订阅.RedisTemplate对应于Redis五大数据类型的api: Api 返回值类型 说明 redisTemplate.opsForValue() ValueOperations 操作 String 类型数

  • Java使用反射获取list泛型过程浅析

    通过属性来获取泛型的类型 Field[] fields = bean.getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true); if(f.getType() == java.util.List.class){ // 如果是List类型,得到其Generic的类型 Type genericType = f.getGenericType(); if(genericType == null) contin

  • 浅析Android Studio 3.0 升级各种坑(推荐)

    点击 Check for Updates 增量更新: 下载完成,会提示更新 您将 Gradle 更新至 4.1: 这里建议您对老项目先暂时点击 Don't remind me on this project,以防有坑.当然我不入地狱谁入地狱,我点 Update,于是问题来了,一直处于下载中,不过,莫担心,我下载好了,公众号聊天界面回复「 gradle-4.1-all 」,下载 gradle-4.1-all.zip 文件,放到: 重启 Android Studio. gradle 目录: Mac系

  • Prototype源码浅析 String部分(四)之补充

    替换 interpolate  | sub |  scan |  truncate | gsubinterpolate : 将字符串看作一个模板,并使用 object 的属性填充它. sub : 将字符串中前指定个个与 pattern 指定的模式匹配的子串用 replacement 替换 scan : 遍历字符串中与参数 pattern 指定的模式匹配的所有子串.返回原始字符串本身. truncate : 将字符串截短为指定的长度(包含后缀部分), 并添加一个后缀. gsub :将字符串中所有与

  • Prototype源码浅析 String部分(二)

    格式 camelize | capitalize |  underscore |  dasherize  | inspect           变形 toArray |  succ  | times这里面一个有用的方法是inspect,按照参考手册的说明,他的作用是"返回该字符串针对调试的字符串表现形式(即用单引号或双引号包括起来,并使用 '\' 对特殊字符进行转义)",在Object的toJSON里面也涉及到这个方法. 既然涉及到需要转义的字符,我们自然要一份转义字符信息,下面直接

  • 浅析angularJS中的ui-router和ng-grid模块

    在家里闲着无聊,正好在网上找到了一个关于angular的教程,学习了一下angular的ui-router和ng-grid这两个模块,顺便模仿着做了一个小小的东西. 代码已经上传到github上,地址在这里哟https://github.com/wwervin72/Angular. 有兴趣的小伙伴可以看看.那么然后这里我们就先来了解一下这两个模块的用法. 我们先来说说ui-router这个模块,这个模块主要是用来实现深层次的路由的.其实angular有个内置的指令ng-route,如果在项目中没

  • .NET下文本相似度算法余弦定理和SimHash浅析及应用实例分析

    本文实例讲述了.NET下文本相似度算法余弦定理和SimHash浅析及应用.分享给大家供大家参考.具体分析如下: 余弦相似性 原理:首先我们先把两段文本分词,列出来所有单词,其次我们计算每个词语的词频,最后把词语转换为向量,这样我们就只需要计算两个向量的相似程度.   我们简单表述如下   文本1:我/爱/北京/天安门/ 经过分词求词频得出向量(伪向量)  [1,1,1,1]   文本2:我们/都爱/北京/天安门/ 经过分词求词频得出向量(伪向量)  [1,0,1,2]   我们可以把它们想象成空

  • 浅析Python中的for 循环

    Python for 和其他语言一样,也可以用来循环遍历对象,本文章向大家介绍Python for 循环的使用方法和实例,需要的朋友可与参考一下. 一个循环是一个结构,导致第一个程序要重复一定次数.重复不断循环的条件仍是如此.当条件变为假,循环结束和程序的控制传递给后面的语句循环. for循环: 在Python for循环遍历序列的任何物品,如一个列表或一个字符串,有能力. for循环语法是: for iterating_var in sequence: statements(s) 如果一个序列

  • 浅析SQL Server的聚焦使用索引和查询执行计划

    前言 上一篇<浅析SQL Server 聚焦索引对非聚集索引的影响>我们讲了聚集索引对非聚集索引的影响,对数据库一直在强调的性能优化,所以这一节我们统筹讲讲利用索引来看看查询执行计划是怎样的,简短的内容,深入的理解. 透过索引来看查询执行计划 我们首先来看看第一个例子 1.默认使用索引 USE TSQL2012 GO SELECT orderid FROM Sales.Orders SELECT * FROM Sales.Orders 上述我们看到第2个查询的所需要的开销是第1个查询开销的3倍

随机推荐