|
泛型的学习
一、泛型的引入
- 泛型---泛:宽泛的--不确定的; 型:类型---不确定的类型
- 无处不在的
- 调用普通方法的时候,参数类型在声明的时候就确定了,调用按照类型传递参数即可
a. 如果有100个类型---100个方法?--很累
b. 有没有能够做一个方法可以能够满足不同类型的需求呢?
传统方法- public static class CommonMethod
- {
- public static void ShowInt(int Parameter)
- {
- Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
- }
- public static void ShowString(string Parameter)
- {
- Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
- }
- public static void ShowDateTime(DateTime Parameter)
- {
- Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
- }
- }
复制代码
- Object类型作为参数 ----可以传递不同的参数
a. 任何子类出现的地址都可以让父类来代替
b. 万物皆对象---任何一个类型都是继承自Object
使用Object类型- public static class CommonMethod
- {
- public static void ShowObject(object Parameter)
- {
- Console.WriteLine($"This is {typeof(CommonMethod).Name} parameter={Parameter},type={Parameter.GetType().Name} ");
- }
- }
复制代码
- 问题
a. 性能问题 ---装箱拆箱---在c#语法中,按照声明时决定类型的(栈、托管堆)
b. 类型安全问题
我们通过一个例子来体现性能的问题- public class PerformanceTest
- {
- public static void Show()
- {
- int ivalue = 1234;
- //消耗的时间
- long commonSecond = 0;
- long objectSecond = 0;
- long genericSecond = 0;
- {
- Stopwatch sw = new Stopwatch();
- sw.Start();
- for (int i = 0; i < 1000_000_000; i++) {
- ShowInt(ivalue);
- }
- sw.Stop();
- commonSecond = sw.ElapsedMilliseconds;
- }
- {
- Stopwatch sw = new Stopwatch();
- sw.Start();
- for (int i = 0; i < 1000_000_000; i++)
- {
- ShowObject(ivalue);
- }
- sw.Stop();
- objectSecond = sw.ElapsedMilliseconds;
- }
- {
- Stopwatch sw = new Stopwatch();
- sw.Start();
- for (int i = 0; i < 1000_000_000; i++)
- {
- Show(ivalue);
- }
- sw.Stop();
- genericSecond = sw.ElapsedMilliseconds;
- }
- Console.WriteLine($"commonSecond: {commonSecond} objectSecond: {objectSecond} genericSecond :{genericSecond} ");
- }
-
- private static void ShowInt(int r)
- {
- }
- private static void ShowObject(object o)
- {
- }
- private static void Show<T>(T parameter)
- {
- }
- }
复制代码 结果为:
- 有没有既性能好,也能够支持多种类型的方法呢?---泛型方法
a. 声明多了一对尖括号 + 占位符T
b. 调用--也需要多一对尖括号,尖括号中指定的类型要和传递的参数的类型一致。
c. 如果可以参数推到出类型---尖括号可以省略。
- 泛型方法---做到了性能高---可以一个方法满足不同类的需求:---又让马儿跑,又让马吃草
二、泛型的声明
1.泛型方法:在方法名称后面多一对尖括号,尖括号中有占位符
2.延迟声明:声明的时候,只是给一个占位符T,T是什么类型?不知道什么类型---调用的时候,指定你是什么,调用的时候,你说什么就是什么;
3.占位符: T ---类型参数 --- 类型变量
4.类型参数当作方法的参数的时候,明确参数类型。
来源:https://www.cnblogs.com/wenlong-4613615/archive/2023/03/24/17251136.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|