C#泛型回顾点滴

前言

C#的泛型一直是学习者津津乐道的课题了,这确实是一个非常有用的特性,不过在实际使用中,还是有很多需要注意的地方,我们需要通过自己动手实践以及结合理论进行理解,最终总结出自己的编码规范和最佳实践

案例1

internal struct TestStruct : IEquatable<TestStruct>
{
    bool IEquatable<TestStruct>.Equals(TestStruct other)
    {
        return true;
    }
}

internal class TesterClass
{
    // Methods
    public static bool AreEqual<T>(T arg1, T arg2) where T : IEquatable<T>
    {
        return arg1.Equals(arg2);
    }

    public static void Run()
    {
        TestStruct t1 = new TestStruct();
        TestStruct t2 = new TestStruct();
        Debug.Assert(((IEquatable<TestStruct>)t1).Equals(t2));
        Debug.Assert(AreEqual<TestStruct>(t1, t2));
    }
}

案例2

class Program
{
    static void Main(string[] args)
    {
        Print1(1);
        Print2(1);
        Print3(1);

        string a = "ABC";
        string b = "AB";
        string c = b + "C";

        bool genericEquals = IsEquals<string>(a, c);
        bool directEquals = (a == c);

        Console.ReadKey();
    }

    static void Print1<T>(T item)
        where T : struct
    {
        string s = item.ToString();
    }

    static void Print2<T>(T item)
    {
        string s = item.ToString();
    }

    static void Print3(int item)
    {
        string s = item.ToString();
    }

    static bool IsEquals<T>(T t1, T t2)
        where T : class
    {
        return t1 == t2;
    }

}

思考以上代码,在内部是怎样的执行过程?结果如何?为什么?

要点

  • 泛型中的装箱和拆箱
  • 泛型中的逆变与协变

未完待续、、、

时间: 2024-10-05 15:22:00

C#泛型回顾点滴的相关文章

集合泛型回顾加强

一.谈起集合,首先应该想到一个图,如下: 二.记住set与list的特征和区别: set是无序且不可重复,list是有序可重复. 三.linkedlist与ArrayList的区别: 选用list时候用linedlist还是arraylist也要看他们的特点来区别对待: linkedlist是用链表来实现的,修改容易,查找困难,而ArrayList是用数组实现的,查找容易,但修改就很繁琐,这个是为啥呢?我先查一查,再在这里补充. 四.泛型 泛型主要是针对jdk1.5之前,类型混乱,装入集合的类型

泛型反射

一. 泛型回顾 1. 泛型参数可以有多个. 2. 开放类型(泛型类)和封闭类型(泛型类的实例). 3. 泛型类的继承 4. 泛型约束(where T : new() – 目前.NET只支持无参构造函数的约束) (1)构造函数约束: (2)基类约束: (3)struct/class约束: (4)构造器约束: 5. 泛型方法的类型参数,可以用在该方法的形参,方法体,返回值三处. 6. 泛型方法的重载,类型参数和方法参数列表都是构成重载的元素. 7. 泛型方法的重写 程序示例: 1 public cl

Richard Warburton与Raoul-Gabriel Urma在Devoxx UK 2015上回顾Java泛型历史

本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap Richard与Raoul向广大开发者提供关于Java 8的培训课程.近日,二人在Devoxx UK 2015上共同进行了一场演讲,回顾了Java泛型的起源与动机.介绍了目前一些不为人知的特性,同时对Java 10进行了展望.该演讲由3个精彩的部分构成:泛型的过去.现在与未来. 过去 正如Richard与Ra

回顾javase点滴

数据类型 8种基本数据类型和引用类型 数据类型 占用位数 存储方式 最小值 最大值 默认值 byte 8 1+7 -128(-2^7) 127(2^7-1) 0 short 16 1+15 -32768(-2^15) 32767(2^15-1) 0 int 32 1+31 -2147483648(-2^31) 2147483647(2^31-1) 0 long 64 1+63 -2^63 2^63-1 0L float 32 1实数符号位+1指数符号位+7指数位+23实数位 (与整数不同,符号位

Java基础知识回顾-20(泛型)

1.由于集合中什么类型的元素都可以存储.导致取出时,如果出现强转就会引发运行时 ClassCastException.怎么来解决这个问题呢?使用集合时,必须明确集合中元素的类型.这种方式称为:泛型. 2.泛型的应用分为三种:含泛型的类,含有泛型的接口,含有泛型的方法. 3.泛型使用时的定义格式:(1)修饰符 class 类名<代表泛型的变量> { } (2)  public <T> T[] toArray(T[] a){ }  (3)   修饰符  interface 接口名<

泛型与通配符详解

1回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. class ClassGenericity<T> { //在类里面可以直接使用T的类型 T aa; public void test11(T bb) { //................ } //静态方法 在类上面定义的泛型,不能再静态方法里面使用 public static <A> void test12(A cc) { //.................. } } public class TestCla

Java(SE)内容回顾

也是大学的时候写的,现在回头看看,那时候的想法还是有点小小的幼稚,文章内容也...哈哈...欢迎拍砖 学Java一段时间了,小小的回顾下,理一下结构.另外,提一下,哥哥是做C/C++的,不做Java,Java仅仅是学习一下. Java基本语法 一 Java基础部分 1 数据类型 2 控制流程 3 函数 二 Java面向对象部分 1 类定义 2 封装 3 继承 4 多态 5 抽象类 6 接口 7 异常处理 8 根类Object 9 包 Java多线程 1 线程创建方法1:继承Thread,重写Ru

泛型委托学习进程

首先先回顾委托的使用过程步骤: 委托使用总结: (1)     委托声明(定义一个函数原型:返回值+参数类型和个数)注:在类的外部--中介(房产中介商) (2)     根据委托定义"具体"的方法------房源   注:在类中定义方法 (3)     创建委托对象,关联"具体方法"---中介商拥有房源  注意:在主函数中操作 第一种方式:使用new初始化.第二种方式:直接给委托变量赋值方法 (4)     通过委托去调用方法(而不是直接调用方法)------中介带

黑马程序员 Java SE回顾

----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java SE基础回顾 1.循环语句中的break是终止全部循环,跳出循环体:而continue是终止本次循环,跳执行下一循环 2.return语句有两个作用:返回值:结束方法的运行 3.对于java中面向对象的理解:以类的方式组织代码,以对