[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化
[泛型的概念]
(1)没有泛型的时候,所有的对象都是以object为基础,如果要使用时必须进行强制类型转换,如果对于值类型,则会导致不断拆箱装箱的过程,对系统消耗很大。
(2)使用泛型时不需要通过object类进行装箱拆箱,使用的时候都会是确定的类型。
(3)泛型的概念一开始是由集合引入,因为集合中的类型都是基于object类。可以在集合中使用泛型类。
(4)泛型不仅仅用于集合,还可以用于委托、接口和方法。
泛型的优点:高性能
ArrayList list1 = new ArrayList();
list1.Add(44); //装箱
int il1 = (int)list1[0];//拆箱
foreach (int i2 in list1)
Console.WriteLine(i2); //执行拆箱
频繁的拆箱、装箱操作在没有泛型的时候反复进行,对系统资源消耗很大。可以使用泛型集合。
List<int> list2 = new List<int>();
list2.Add(44); //不执行装箱
int il2 = list2[0];//不执行拆箱
foreach (int i2 in list2)
Console.WriteLine(i2); //不执行拆箱
泛型在定义的时候就区分了值类型和引用类型。
泛型的优点:类型安全
ArrayList list = new ArrayList();
list.Add(44);
list.Add("mystring");
list.Add(new MyClass());
foreach (int i in list)
Console.WriteLine(i);
类型安全在于提前避免异常的出现。
List<int> list2 = new List<int>();
list2.Add(44);
//list2.Add("mystring");
//list2.Add(new MyClass());
直接编译不通过。
泛型的优点:代码的重用与扩展
List<T>这个泛型类在使用时可以根据需要用不同的类型实例化:
List<int> list=new List<int>();
list.Add(44);
List<string> stringList=new List<string>();
stringList.Add(“mystring”);
List<MyClass> myclassList=new List<MyClass>();
myClassList.Add(new MyClass());
泛型的优点:代码的重用与扩展
定义一个泛型类:
public class aaa<T> 注意:这里的T只是一个标识而已,定义成任何字符都可以。
{
public void abc(T a)
{
Console.WriteLine(a);
}
}
使用它:
//使用string实例化
aaa<string> aaa = new aaa<string>();
aaa.abc("aaabbb");
//使用int实例化
aaa<object> bbb = new aaa<object>();
bbb.abc(new object());
Console.Read();
命名约定
(1)泛型类型的名称用字母T作为前缀。
(2)使用泛型时,使用<T>,如:
Public class List<T> {}
Public class Linkedlist<T>{}
(3)如果泛型类型有特定的要求(例如必须实现一个派生于基类的接口),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称:
比如:
public interface ccc<TTT>
{ void abc(TTT arg1); }
public class aaa<TTT>:ccc<TTT>
{ public void abc(TTT a)
{ Console.WriteLine(a); } }
Public class SortedList<TKey,Tvalue>{}
泛型集合
泛型集合存在于using System.Collections.Generic下.我们主要介绍如下List<T> ,其它的泛型集合使用请查阅MSDN。
强类型和弱类型指的是两个具有直接或者间接继承关系的两个类。如果一个类是另一个类的直接或者间接基类,那么它为弱类型,直接或者间接子类为强类型。后续的介绍中会用到的两个类Foo和Bar先定义在这里。Bar继承自Foo。Foo是弱类型,而Bar则是强类型。
有了强类型和弱类型的概念,我们就可以这样的定义协变和逆变:如果类型TBar是基于强类型Bar的类型,而类型TFoo是基于弱类型Foo的类型,协变就是将TBar类型的实例赋值给TFoo类型的变量,而逆变则是将TFoo类型的实例赋值给TBar类型的变量。
委托中的协变与逆变的使用
协变和逆变主要体现在两个地方:接口和委托,先来看看在委托中如何使用协变和逆变。现在我们定义了如下一个表示无参函数的泛型委托 Function,类型参数为函数返回值的类型。泛型参数之前添加了一个out关键字表示T是一个协变变体。那么在使用过程中,基于强类型的委托 Fucntion实例就可以赋值给基于弱类型的委托Fucntion变量。
[强类型弱类型]
一直说C#是强类型语言,通俗地讲,便是指C#中的“变量”在开发时的类型便是明确的:String便是String,Int32就是Int32,毫无争议。强类型的好处有很多,张嘴便可随意举上几例:
能够享受代码提示功能
能够获得重构工具的支持
能够在编译期发现更多错误
不过C#也不是“绝对”的强类型语言,因为它也有弱类型,那就是Object。我们知道Object是所有类型的最终基类,任何类型的对象都可以使用 Object来引用。可是一旦转化成Object的变量之后,代码提示便消失了;即使我们“明确”对象的确切类型,也必须通过Cast才能使用——更何况它形成了一种被“滥用”或“误用”的机会。例如一段错误代码可能会传入一个不符合约定类型的对象,那么就会造成错误。更严重的是,这样的错误可能只要在 “运行时”才能被发现,编译器对此无能为力。
摘自:http://hi.baidu.com/morespring/blog/item/fe9220358a03690aebc4afa4.html
转载于:https://www.cnblogs.com/bluewhale84/p/4401705.html
[转]c# 泛类型(泛型) 以及强类型与弱类型的 理解及优化相关推荐
- python程序设计语言是什么类型的语言-Python 是弱类型的语言 强类型和弱类型的语言区别...
Python 是弱类型的语言 在强类型的编程语言中,定义变量时要指明变量的类型,而且赋值的数据也必须是相同类型的,C语言.C++.Java 是强类型语言的代表. 下面我们以 C++ 为例来演示强类型语 ...
- 编程语言分类 -- 强类型与弱类型、动态类型与静态类型
文章内容输出来源:拉勾教育 大前端高薪训练营 前言 在拉勾教育大前端高薪训练营学习的过程中,了解到编程语言除了以前常说的高级语言与低级语言之分,还可以根据类型安全分为强类型语言与弱类型语言,也可以根据 ...
- python 强类型 弱类型_强类型、弱类型
什么是强类型,什么是弱类型? 之前一直写的OC语言,在自己的意识中,所有数据类型是定义好的,如果改变数据的类型必须进行强制类型转换. 但是接触了JavaScript后发现,一个变量,可以是字符串,也可 ...
- 【JavaScript】——强类型和弱类型
强弱类型的判别 按照计算机语言的类型系统的设计方式,可以分为强类型和弱类型两种. 二者之间的区别,就在于计算时是否可以不同类型之间对使用者透明地隐式转换. What 弱类型 从使用者的角度来看,如果一 ...
- Java是动态语言还是静态语言,是强类型还是弱类型?
一. 前言 今天小熙突然想到一个问题,那就是Java到底是动态语言还是静态语言,是强类型还是弱类型呢?虽然知道但是还是不够深入,接下来就一起探讨下吧. 二. 图释 小熙碰巧看到一张图,完美的区分了以上 ...
- 编译语言与解释语言,动态与静态,以及强类型和弱类型的区别
编译和解释的区别是什什么? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机 可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释 ...
- MVC强类型和弱类型的区别
1 强类型的处理 首先必须要有一个对象的实体类,UserINfo就是一个实体类,如下: public class UserInfo() { public int Id{set;get;} publi ...
- (动态,静态)(解释,编译)(强类型,弱类型)
1 动态语言和静态语言通常我们所说的动态语言.静态语言是指动态类型语言和静态类型语言.1 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不 ...
- java 强类型 弱类型_强类型,弱类型,静态类型,动态类型的区别
强.弱类型 强类型strongly typed: 如果一种语言的所有程序都是well behaved--即不可能出现forbidden behaviors,则该语言为strongly typed. 弱 ...
最新文章
- java 不可最小化,java – 这是最小化绑定失效的有效方法吗?
- c++ 开方_刷屏时尚圈!The Story Shoulder稳坐风尚C位的背后究竟有什么奇妙魔力?...
- 列举某域名下所有二级域名的方法
- Ubuntu下的固件分析Binwalk的安装
- sdi线缆标准_松下会议摄像机新品AWUN145MC所搭载的12G/SDI到底是什么?
- 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
- 简易的深度学习框架Keras代码解析与应用
- mybatis 原理_深入理解MyBatis原理 MyBatis数据源与连接池
- C#开源项目一览表[转](包含国内和国外)
- android 4.0 蓝牙分析之二
- PyTorch入门(三)损失函数与反向传播
- python mock接口返回数据(转载)
- 【笔记】TAOCP Vol4 - Combination
- 现实中的CTF大赛都有哪些人参与
- [953]mongo创建索引及索引相关方法
- 空空导弹发展及作战特点
- Programming Assignment 4: Boggle
- lenovo服务器换系统重装系统_联想电脑怎么重装系统步骤如下:联想怎么重装正版win10...
- 赶紧收藏,都在用的四种标题写法
- iOS:error: exportArchive:No certificate for team ‘xxx‘ matching ‘‘xxx found
热门文章
- android源代码 abi,Android内核源码Abi目录学习笔记
- 交换排序图解_图解简单选择排序
- java语言的实现机制_JAVA语言之Java NIO的工作机制和实现原理介绍
- linux tmux离线安装,linux环境下安装tmux
- mysql编码不对_MySQL编码不一致导致乱码问题总结
- spring 两次进入拦截器_4.SpringBoot 拦截器Fliter,Interceptor,Controller……
- js手机键盘遮挡_完美解决手机网页中输入框被输入法遮挡的问题
- java 类的执行顺序_java类加载的顺序
- pythongui登录界面密码显示_python的GUI之一个简单的登录界面
- 华为机考HJ2计算字符个数