ReC#:泛型01

作者: 伪犬儒李长歌 | 来源:发表于2017-08-10 20:31 被阅读0次

这个系列没有先后顺序,主要是为了加深自己的理解,通过这样记录自己也会在过程中去产生跟多的思考。从零开始的学习,就借这个自己记录一下,结合的书籍是《C#图解教程(第四版)》和自己的脑洞理解,不那么靠谱还请见谅~

泛型

C#提供了六种自定义的类型(class、struct、array、enum、delegate、interface),通过这六种类型我们已经可以去建立很复杂具体的对象。有时我们会为了一个用途去写某个模块(记作MyStruct),但事后发现该模块其实还可以用在别的地方,但是由于处理的数据不同这时候可能映入脑中的是,大不了在写一个模块,改变一下数据类型。这个方法确实能解决这个问题,但如果太多的情况下要使用这个模块这种简单的方法无疑是增加了代码的耦合。
而泛型便可以很好的解决这个问题,C#提供了五种泛型(类、结构、接口、委托和方法)
下面则是一个类泛型的例子

 class MyStruct {
        const int lenght = 10;
        private int[] arry;
        private int index = 0;
        public void Push(int i) {
            if (arry == null)
                arry = new int[lenght];
            arry[index] = i;
            index++;
        }
        public int Peek()
        {
            return arry[index-1];
        }   
    }
  class MyStruct<T>
    {
        const int lenght = 10;
        private T[] arry;
        private int index = 0;
        public void Push(T i)
        {
            if (arry == null)
                arry = new T[lenght];
            arry[index] = i;
            index++;
        }
        public T Peek()
        {
            return arry[index - 1];
        }
    }
  class Program
    {
        static void Main(string[] args)
        {
            int a = 12;
            int b = 10;
            string m = "Hello";
            MyStruct myStruct1 = new MyStruct();
            MyStruct<string> myStruct2 = new MyStruct<string>();
            myStruct1.Push(a);
            myStruct1.Push(b);
            myStruct2.Push(m);
            Console.WriteLine(myStruct1.Peek());
            Console.WriteLine(myStruct2.Peek());
        }
    }

通过泛型,可以非常方便去重用一些模块。T在这里是一个占位符,也可以用其他来代替。
泛型类的声明如下:
-在类名之后放置一组尖括号。
-在尖括号中用逗号分隔的占位符字符串来表示希望提供的类型。这叫做类型参数(typeparameter)。
-在泛型类声明的主体中使用类型参数来表示应该替代的类型。

 class SomeClass<T1, T2>where T1:System.Type
                        where T2:System.Object      
                            //T1,T2 为类型参数
    {
        public T1 SomeValue =  T1;
        public T2 SomeObject = new T2();
    }

上面是泛型类的一种抽象实现。,这里出现了where,它是泛型中的约束。

约束

对于第一个我们定义的泛型栈来说,它对所有类型参数都只是做了Push和Peek的操作,并没用到项本身的运算符的事情。但在我们的实际情况下,我们不得不去访问处理一些类型的对象,这时,如果不去约束的话往往编译时会报错。
要让泛型变得更有用,我们需要提供额外的信息让编译器知道参数可以接受哪些类型。这些额外的信息叫做约束。
约束使用where子句列出。
-每一个约束有约束的类型参数有自己的where字句
-如果形参有多个约束,它们在where字句中使用逗号分隔。

where TypeParam : constraint , constraint, ...

class MyClass<T1,T2,T3> where T2 : Customer
                        where T3 : IComparable
{
   ....
}

约束的类型与次序:

Re泛型.png

相关文章

  • ReC#:泛型01

    这个系列没有先后顺序,主要是为了加深自己的理解,通过这样记录自己也会在过程中去产生跟多的思考。从零开始的学习,就借...

  • Java 泛型

    01.泛型 泛型的本质是参数化类型,使用泛型可以获得更高级的抽象。 Java泛型(generics)是JDK 5 ...

  • bunny笔记|TS基础(2):泛型函数、泛型约束、在泛型约束中

    01 typescript的操纵类型 02 03 04 泛型约束 05 在泛型约束中使用类型参数 06 在泛型中使...

  • 01 泛型

    1 Java语言高级特性前言 java知识是作为Android开发的语言基础,虽然现在我们已经推出了kotlin,...

  • 泛型01

    package All.D13.Generic_; public class Demon01 {Object ov...

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • 探秘 Java 中的泛型(Generic)

    本文包括:JDK5之前集合对象使用问题泛型的出现泛型应用泛型典型应用自定义泛型——泛型方法自定义泛型——泛型类泛型...

网友评论

    本文标题:ReC#:泛型01

    本文链接:https://www.haomeiwen.com/subject/srnhrxtx.html