泛型基础----------泛型方法一
程序员文章站
2022-07-15 21:00:56
...
最近在出差,也不可开交,没有学习什么,也没有整理什么。昨天出去去大海边浪了一天,今天寻思着整理点东西吧。想来想去,泛型!我说说理由吧:
1、对于现在的程序员来说,不会泛型,或者说不了解泛型,代码都不好写啊,会被鄙视的。
2、从上班开始,就一直在用泛型,刚开始那会还真的不会,就觉得wocao wocao 这是什么,怎么可以这么写,好厉害好流弊啊。
3、就往上一层来说,到架构层什么的,泛型我觉得得成为必须要玩转的东西了,虽然我还离架构师辣么辣么的遥远,对于玩转泛型也有辣么辣么漫长的路要走。
言归正传,为什么要有泛型?我们编程(码代码的高级说法)的时候,经常会有这样的情况,其实就是去做同一件事,我们要写的这段代码发现有好几种情况,但是这几种情况来说,仅仅是参数的类型不同,那我们就要根据不同的参数类型去做重载写几个方法吗?其实我也经常这么做,咱们有个规则不是尽量少去Copy自己写好的的代码去实现相似的工作,去优化你的代码这个规则吗。还有比较绝的解决方式,参数定义成object的,然后用什么装箱拆箱反射那一套,最后都惨不忍睹了,效率,可读性什么的都不行了。为了解决这个问题,微软在.netframwork2.0的时候推出了泛型。
先上代码(我习惯了用winform的弹窗去看一些直观的东西):
这里写一个公共类,都是具体的实现方法,调用就在winform窗体中调用了
namespace Generic0521.Common
{
public static class GenericBase01
{
public static void ShowInt(int i)
{
MessageBox.Show(i.ToString() + "--------" + i.GetType());
}
public static void ShowString(string str)
{
MessageBox.Show(str.ToString() + "--------" + str.GetType());
}
public static void ShowPeople(People pp)
{
MessageBox.Show(pp.GetType().FullName);
}
public static void ShowObject(object obj)
{
MessageBox.Show(obj.ToString() + "--------" + obj.GetType());
}
}
这里定一个model,就用咱们在各种教程什么里的people做栗子:
namespace Generic0521.Model
{
public class People
{
public int ID { get; set; }
public string Name { get; set; }
}
}
这里是我窗体调用代码:
namespace Generic0521
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
GenericBase01.ShowInt(1);
GenericBase01.ShowString("1");
GenericBase01.ShowPeople(new People { ID = 1, Name = "qhh" });
GenericBase01.ShowObject(1);
}
}
}
从公共类中我们看到,我定义几个方法,仅仅去看他们的值和类型,复杂的就只看类型了,我定义了前三个方法,调用前三个,这就是最上面说的,copy自己的方法,然后改吧改吧,没什么实际创造性。最后一个用类型的父类object,可是就像上边说的装箱拆箱什么的,代码少了,效率来说,调用的可读性来说,还是差了那么点儿。
所以我加了一个方法:
public static void ShowT<T>(T t) {
MessageBox.Show(t.ToString() + "--------" + t.GetType());
}
调用如下:
GenericBase01.ShowT<int>(1);
GenericBase01.ShowT<string>("1");
GenericBase01.ShowT<People>(new People { ID = 1, Name = "qhh" });
GenericBase01.ShowT(1);
GenericBase01.ShowT("1");
GenericBase01.ShowT(new People { ID = 1, Name = "qhh" });
这就是泛型方法,可以看出,定义的时候,在方法名后面加了一对尖括号<>,在参数那里咱们之前定义用的参数类型,换成了尖括号中的内容,其他没有什么变化了吧?是不是很简单?
在调用的时候,跟之前的区别是,在方法名后边也是加上了尖括号<>,并且尖括号中的形式T换成了你想穿的参数类型,后,面实参内容传实参,然后我还写了一种调用方式,你会发现,跟之前的那种原始的写法调用没有任何区别。这就是我之前刚工作时候调用别人写的泛型方法时候觉得好神奇的地方。
咱们为了实现用一个方法传不同参数,写了两种方式,无非是代码多少的问题,但这牵扯到了编译时确定类型,还是执行时确定类型,时间换空间,还是空间换时间?装箱拆箱在运行时确定类型,费时间,泛型方法其实是语法糖,在编译确定了类型,然后会在调用的地方,在生成一份跟咱们分别写方法一样的方法副本,打在dll中,稍微那么点点的废了点空间,但是现在的电脑硬盘,在乎那么几k几M的空间吗,效率跟不上客户分分钟要弄死你的好吧。
总结一下泛型方法定义吧,理论不总结了:
定义: 修饰符 返回类型 方法名<T>(T t)
{}
public void Show<T>(T t)
{}
就这样了,这个T不一定非得是T啊 ,你想用什么都行,就是一占位符的作用,而且,可以是多个参数,还可以跟其他参数一起混用:
修饰符 返回类型 方法名<T,X,Y,K>(T t,X x,Y y,K k,int i)
{}
上一篇: (二)Web框架-龙卷风Tornado之世界上最简单的Tornado示例
下一篇: 泛型的泛型