c# 泛型原理(旧)
前言
说起泛型可能很多人刚才看到的时候肯定会说牛逼啊,厉害啊,这东西少写了不少代码,我总结了泛型的一个优点,那就是少写代码,额,专业点吧。
优点:增加代码的重复利用率,代码重用。
先不讲原理吧,来讲下思想,啥子思想呢?泛型,说到底就是写的也不知道这将来是啥子,但是已经确定好了约束范围,比如说T:class,但是不晓得是哪一个class,等我运行到的时候我传进去我就知道了呗。
说到底就是挖了一个坑,填什么我不知道啊,但是坑要先挖吧,不能等用的时候再填吧,这个不管是不是泛型都要做的事。
int,string这等种不是泛型的搭了一个固定架子,来放int,string等,等上锅的时候放入相应的int,string就按是那种架子放哪种锅就行了呗。
这个架子是什么意思呢?比如说int32就是4个字节,那么会挖好坑,然后架子就是这4个字节。
泛型和他们有啥不一样呢?他就是挖了坑不放架子,等用的时候再告诉系统放什么架子填入数据再去让cpu跑。
思想:延迟思想(性能优化的一种方式)。
我当时就想为啥他能这么干呢?
后来找到了一张图,恍然大悟,分享一下哈。

所有的c#代码来源这张图,我这么说肯定有人反对的,c#1.0就不是啊,好吧我们从2.0开始吧,相信大家都没有去用1.0的吧,泛型的出现没有这个是实现不了的。
过程是:经过编译器转换为中间语言,也就是放在dll中,然后再到clr填入数据,然后交给机器语言,这个过程我们就发现原理数据是最后填入的,那既然这样我晚点上车其实是一样的。
泛型的好处:
static void Main(string[] args)
{
int Ivalue = 1;
string sValue = "1";
object oValue = 1;
Console.WriteLine("*************非泛型***************");
{
show(Ivalue);
show(sValue);
show(oValue);
}
Console.WriteLine("*************泛型***************");
{
showint(Ivalue);
showstring(sValue);
showObject(oValue);
}
Console.Read();
}
public static void show<T>(T data)
{
Console.WriteLine("data:{0},type:{1}", data, data.GetType());
}
public static void showint(int Idata)
{
Console.WriteLine("data:{0},type:{1}", Idata, Idata.GetType());
}
public static void showstring(string Sdata)
{
Console.WriteLine("data:{0},type:{1}", Sdata, Sdata.GetType());
}
public static void showObject(object Odata)
{
Console.WriteLine("data:{0},type:{1}", Odata, Odata.GetType());
}
泛型和非泛型性能的对比,计算一亿次。个人认为泛型的最大的好处在于避免装箱拆箱。
c# 泛型原理(旧)的更多相关文章
- Atitit 泛型原理与理解attilax总结
Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...
- java从基础知识(八)泛型
1.什么是泛型? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法 ...
- Java泛型:泛型的定义(类、接口、对象)、使用、继承
地址 http://blog.csdn.net/lirx_tech/article/details/51570138 1. 设计泛型的初衷: 1) 主要是为了解决Java容器无法记忆元素类型的问题 ...
- Java 泛型-泛型类、泛型方法、泛型接口、通配符、上下限
泛型: 一种程序设计语言的新特性,于Java而言,在JDK 1.5开始引入.泛型就是在设计程序的时候定义一些可变部分,在具体使用的时候再给可变部分指定具体的类型.使用泛型比使用Object变量再进行强 ...
- 20、Java 泛型
1.晓之以理,动之以码 学Java就是很上头哦,一来直接三连问!!! 什么是泛型?为什么要用泛型?泛型怎么用? 当然泛型在Java中有很重要的一个地位,在面向对象编程以及在各种设计模式中有非常广泛的应 ...
- 读书笔记之《深入理解Java虚拟机》不完全学习总结
写在前面: 之所以称作不完全总结,因为我其实没有完完全全地看完此书,但是涵盖了大部分重要章节:同时以下总结是我自己认为很重要知识,细枝末节处难免遗漏,还请详细参考原著. 转载请注明原文出处:http: ...
- Keep面经汇总
目录 一.Java 线程如何终止 如何用一个cancel方法停止两个线程 泛型原理.使用场景.优缺点 手写代码,设计parseInt hashmap是怎么实现的,是线程安全的吗 知道hashmap的扩 ...
- Java面试题 BAT 大公司面试题整理总结!
本文只列出了问题,答案还是需要需要自己的总结,很多时候自己总结出来的语言在面试时比硬背的效果好很多. 这些题目是网友去百度.小米.乐视.美团.58.猎豹.360.新浪.搜狐等一线互联网公司面试被问到的 ...
- ILBC 规范 2
接上篇 <ILBC 规范> https://www.cnblogs.com/KSongKing/p/10354824.html , ILBC 的 目标 是 跨平台 跨设备 ...
- 《深入理解Java虚拟机》笔记(转)
文章来自http://www.cnblogs.com/tianchi/archive/2012/11/11/2761631.html 在C里面我们想执行一段自己编写的机器指令的方法大概如下: type ...
随机推荐
- C++ //set/multiset 容器 //set不可以插入重复的数字 multiset可以插入重复的数字 //ste容器构造和赋值 //set大小和交换 //set 插入和删除 //set查找和统计 //set 和 multiset 区别 //pair 对组创建 //set存放自定义数据类型 //set内置数据 进行排序
1 //set/multiset 容器 //set不可以插入重复的数字 multiset可以插入重复的数字 2 //ste容器构造和赋值 //set大小和交换 //set 插入和删除 3 //set查 ...
- 8、zookeeper的集群搭建
完全配置--https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_zkMulitServerSetup https://zoo ...
- 俄罗斯套娃 (Matryoshka) 嵌入模型概述
在这篇博客中,我们将向你介绍俄罗斯套娃嵌入的概念,并解释为什么它们很有用.我们将讨论这些模型在理论上是如何训练的,以及你如何使用 Sentence Transformers 来训练它们. 除此之外,我 ...
- vagrant 多个box的操作|共享目录失败
本来机器上已经有一个Ubuntu的box了,今天想在安装一个centos的box,结果还折腾了很长时间. 多个机器的命令 添加box的时候需要使用名称,一个的时候可以忽略名称 vagrant box ...
- Ambiq Micro-AMA3B2KK-KBR芯片可穿戴产品解决方案开发之基于Freertos系统的按键和LED控制
一 前记 freetos在可穿戴设备上应用十分广泛,用来实现基本的按键和led控制,来熟悉它的基本架构.这是一个不错的尝试. 二 源码分析 1 系统初始化 这个启动task,相当于系统的入口函数,这里 ...
- decltype总结
decltype会识别const和引用 decltype一个表达式的时候会判断该表达式是左值还是右值,如果是左值就返回引用,否则就返回非引用. int &a = xx; const declt ...
- vue-router动态注册
来源 写路由时每新建一个路由都需要import一下或其他方式(如箭头函数import)很是麻烦,有麻烦就有需求,于是以下这篇文章就来了 吹水 要想动态注册路由,那么就需要制定规则,即每个路由有一定的规 ...
- 【论文阅读】NIDS对抗性机器学习综述
基本信息 题目:Adversarial Machine Learning for Network Intrusion Detection Systems: A Comprehensive Survey ...
- KingbaseES V8R3 集群运维系列 -- sync_flag参数配置
案例说明: 在KingbaseES V8R3集群一主二备的架构中,配置了流复制为同步(sync)模式,但是集群启动后,流复制状态中显示备库是async模式(备库和主库数据已经同步),从备库的rec ...
- C++代码实现OnComponentHit事件粒子消失蓝图--斯坦福
蓝图节点 OnComponentBeginOverlap,OnComponentHit等等之类如何迁移到C++中 方法 这些蓝图节点实际上就是一个UE4已经定义好的事件,在蓝图中使用模块的连接来实现事 ...