搜索

查看: 3085|回复: 11

[ASP.NET] ASP.NET泛型一之泛型简介与基本语法

[复制链接]
发表于 2023-5-4 11:32:48 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:32:48 3085 11 看全部
".NET泛型"系列:
ASP.NET泛型一之泛型简介与基本语法
ASP.NET泛型二之泛型的使用方法
ASP.NET泛型三之使用协变和逆变实现类型转换
ASP.NET泛型四之使用Lazy实现延迟加载
.NET泛型或许是借鉴于C++泛型模版,借助它可以实现对类型的抽象化、泛型处理,实现了类型和方法之间的解耦。一个最经典的运用是在三层架构中,针对不同的领域模型,在基接口、基类中实现针对各个领域模型的泛型处理。
为什么需要泛型
不用泛型
来看一个比较类型的方法。
    public class Calculator
    {
        public static bool AreEqual(int value1, int value2)
        {
            return value1 == value2;
        }
    }
在客户端调用。
    class Program
    {
        static void Main(string[] args)
        {
            bool result = Calculator.AreEqual(1, 2);
            if (result)
            {
                Console.WriteLine("相等");
            }
            else
            {
                Console.WriteLine("不等");
            }
            Console.ReadKey();
        }
    }
运行结果:不等

不用泛型的缺点一:不是类型安全
如果我们想使用现在的方法来比较字符串类型。
bool result = Calculator.AreEqual("A", "B");
这时,看到编译器报错。从这点来看,AreEqual()方法不是类型安全的方法,当输入string类型,编译器就会报错。
如果把AreEqual()方法的参数类型改成object,编译器就不再报错。
    public class Calculator
    {
        public static bool AreEqual(object value1, object value2)
        {
            return value1 == value2;
        }
    }
以上,运行也正常。
不用泛型的缺点二:装箱与拆箱导致性能降低
现在,对于AreEqual(object value1, object value2),从方法本身来讲是没有问题的,但在客户端调用的时候,比如我们还是想比较值类型。
bool result = Calculator.AreEqual(1, 2);
在运行时,当整型值类型参数1和2传递、赋值给AreEqual(object value1, object value2)中的引用类型参数value1和value2的时候,发生了一次"装箱"操作。而当把引用类型转换成值类型的时候,又会发生一次"拆箱"操作,这导致性能的降低。
使用泛型
把AreEqual()改成泛型方法。
    public class Calculator
    {
        public static bool AreEqual(T value1, T value2)
        {
            return value1.Equals(value2);
        }
    }
于是,在客户端可以这样:
bool result = Calculator.AreEqual("A", "A");
bool result = Calculator.AreEqual(5, 3);
由此,使用泛型的好处有:
1、实现了方法和类型的解耦。
2、不会造成类型转换,规避了因装箱于拆箱引起的性能问题。
3、泛型保证了类型的绝对安全。
当然,还可以把T的位置放在类上:
    public class Calculator
    {
        public static bool AreEqual(T value1, T value2)
        {
            return value1.Equals(value2);
        }
    }
然后这样使用:
bool result = Calculator.AreEqual("A", "A");
bool result = Calculator
泛型的运行时本质
CLR中有专门的IL指令支持泛型操作。
→初次编译时,生成IL代码和元数据,T只是类型占位符,在编译时不进行实例化
→JIT编译时,以实际类型替换元数据中的T占位符
→将元数据转换为本地代码
泛型语法
class MyArray where T : Student, new()
{
    private T[] _items;
    public T myData;
    public MyArray()
    {
        myData = default(T);
    }
    public void Add(T item)
    {}
}
创建泛型实例要指定实际的数据类型:
MyArray[I] myArr = new MyArray[I]();
值类型的默认值为0,引用类型的默认值为null,使用泛型默认值:
myData = default(T);
泛型约束:
  • T : 基类名,表示必须是基类名的派生类
  • T :new(), 表示必须具有无参构造函数,new()约束必须放在最后面
  • T :struct, 表示必须是值类型
  • T :class, 表示必须是引用类型
  • T :接口名,表示必须实现该接口,或实现该接口的接口
    泛型类本质上仍然是一个类,依然可以继承:
    internal class GenericeComparer : Comparer where T : IComparable
    class MyArray : ArrayList
    典型的泛型类
    在System.Collections.Generic命名空间和System.Collections.ObjectModel中,定义了不同的泛型类和泛型接口,这些泛型多为集合类。
  • List 对应ArrayList集合类
  • SortedList 对应SortedList集合类
  • Queue 先进先出的集合类
  • Stack 后进先出的集合类
  • Collection 自定义泛型集合的基类
  • Dictionary 对应于Hashtable集合类
    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对知鸟论坛的支持。如果你想了解更多相关内容请查看下面相关链接
  • 回复

    使用道具 举报

    发表于 2023-6-28 19:10:32 | 显示全部楼层
    123456865 2023-6-28 19:10:32 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-29 09:38:20 | 显示全部楼层
    幸福341 2023-6-29 09:38:20 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    回复

    使用道具 举报

    发表于 2023-6-29 10:34:45 | 显示全部楼层
    贺老师 2023-6-29 10:34:45 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-29 16:20:52 | 显示全部楼层
    戏做顿 2023-6-29 16:20:52 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 19:35:35 | 显示全部楼层
    术数古籍专卖疤 2023-6-29 19:35:35 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-30 01:37:50 | 显示全部楼层
    向往草原403 2023-6-30 01:37:50 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 10:15:09 | 显示全部楼层
    小妖花满楼满fx 2023-6-30 10:15:09 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-30 17:27:01 | 显示全部楼层
    六翼天使494 2023-6-30 17:27:01 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    发表于 2023-7-3 10:15:53 | 显示全部楼层
    462710480 2023-7-3 10:15:53 看全部
    我看不错噢 谢谢楼主!知鸟论坛越来越好!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表