ReC#:泛型01

这个系列没有先后顺序,主要是为了加深自己的理解,通过这样记录自己也会在过程中去产生跟多的思考。从零开始的学习,就借这个自己记录一下,结合的书籍是《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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容

  • object 变量可指向任何类的实例,这让你能够创建可对任何数据类型进程处理的类。然而,这种方法存在几个严重的问题...
    CarlDonitz阅读 882评论 0 5
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,391评论 0 4
  • 本章将会介绍 泛型所解决的问题泛型函数类型参数命名类型参数泛型类型扩展一个泛型类型类型约束关联类型泛型 Where...
    寒桥阅读 590评论 0 2
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,668评论 1 10
  • 湿气重的人,都很虚,没力气,脸色苍白。其实湿气重的人也是阳虚,阳是什么意思,这几晚在代理群里听养生课,关于肾,关于...
    shania_wx阅读 291评论 0 2