zoukankan      html  css  js  c++  java
  • C#复习总结6 (需要进一步复习)

    第十七章 泛型

    1. 什么是泛型

      泛型是为了适应多种不同种类的数据类型而存在的。有了它之后,我们可以不用为不同的数据类型而单独写一个适配。这样很麻烦。

      类型不是对象,而是对象的模板。泛型类型也不是类型,而是类型的模板。

    2. 写法

      C++中,写法比c#中多了一点东西。

      Template <typename T>

      申明完之后,然后才用T。

      C#中,直接用

      Class MyStack<T>

       

      步骤: 声明泛型类型、通过提供真实类型构建构造类型、从构造类型创建实例。

      <>类型参数。 也叫占位符。 和值参数、引用参数、输出参数等类似。

       

      C++中,有模板类,类模板,模板函数,函数模板。其中,模板函数就是函数模板的实例化。

      C#中,有泛型类、构造类。其实后者是前者的实例化。

       

      非泛型栈与泛型栈之间的比较:

    3. 类型参数的约束

      为了让编译器知道参数可以接受哪些类型,需要增加额外的信息。

      需要用where字句。

       

      Class myclass <T1,T2,T3>

      Where T2: Customer

      Where T3: IComparable

      {

      }

       

      约束类型和次序。

      Class struct interface new();

       

    4. 泛型方法

      Public void myfun<T,S> (T p, S t) where S:person

      {

      //内容

      }

       

      调用:myfun<short,int>();

      推断类型,如果编译器已经知道方法调用中具体的参数类型。我们可以省略<> 不写。

       

    5. 扩展方法和泛型类

    6. 泛型结构

    struct Piece<T>

    {

    public Piece(T data) { _data = data; }

    public T _data;

    }

    1. 泛型委托

    delegate R mydelegate<T,R>(T value);

    这里面包含两个参数列表。委托形参列表T value 类型参数列表 R <T,R> 返回值、形参列表、约束字句。

    1. 泛型接口

      Interface Imyifc<T> { T ReturnIt(T invalue); }

      注:泛型接口的实现必须唯一。保证类型实参组合不会在类型中产生两个重复的接口。也就是说,不能有同样的接口声明。

    2. 斜变与逆变

      略。

       

    第十八章 枚举器和迭代器

    1、枚举器

    枚举器可以依次返回请求的数组中的元素。枚举器知道项的次序并且跟踪它在序列中的位置,然后返回请求的当前项。实现了getenumerator方法的类型称为可枚举类型。数组就是其一。可以用 foreach 语句。

    Foreach (int item in array)

    Xxxx;

    数组 是 可枚举类型,它是一个枚举器的对象,是实现了Ienumerable接口的类型。数组实现了getenumerator方法。在枚举器里面还有很多函数成员。Current、movenext、reset。

    1. using System;
    2. using System.Collections;
    3. using System.Linq;
    4. using System.Text;
    5.  
    6. namespace CsharpStart
    7. {
    8.     class ColorEnumerator : IEnumerator
    9.     {
    10.         string[] _colors;
    11.         int _posion = -1;
    12.         public ColorEnumerator(string[] theColors)
    13.         {
    14.             _colors = new string[theColors.Length];
    15.             for (int i = 0; i < theColors.Length; ++i )
    16.             {
    17.                 _colors[i] = theColors[i];
    18.             }
    19.         }
    20.         public object Current
    21.         {
    22.             get
    23.             {
    24.                 if (_posion == -1)
    25.                 {
    26.                     throw new InvalidOperationException();
    27.                 }
    28.                 if (_posion >= _colors.Length)
    29.                 {
    30.                     throw new InvalidOperationException();
    31.                 }
    32.                 return _colors[_posion];
    33.             }
    34.         }
    35.         public bool MoveNext()
    36.         {
    37.             if (_posion < _colors.Length -1)
    38.             {
    39.                 _posion++;
    40.                 return true;
    41.             }
    42.             else
    43.             {
    44.                 return false;
    45.             }
    46.         }
    47.         public void Reset()
    48.         {
    49.             _posion = -1;
    50.         }
    51.  
    52.     }
    53.     class Spectrum : IEnumerator
    54.     {
    55.         string[] Colors = { "volilet", "blue", "cyan", "yellow" };
    56.         public IEnumerator GetEnumerator()
    57.         {
    58.             return new ColorEnumerator(Colors);
    59.         }
    60.     }
    61.  
    62. }

      当然,也支持泛型枚举接口。

    2、迭代器

    迭代器是由多个yield语句的代码块。迭代器可以用来创建可枚举类。

  • 相关阅读:
    Java程序,JDK的安装、环境的配置
    Oracle数据库,序列、索引、视图
    Oracle数据库,内置函数小结
    Oracle数据库,join多表关联方式、union结果集合并
    Oracle数据库,模糊查询、去重查询
    Oracle数据库,查询语句、内置函数
    Oracle数据库,数据的增、删、改、查
    Unity 3D-Canvas画布的三种模式
    Unity 3D-Navigation网格导航系统使用教程
    Xlua使用教程、攻略
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/4170746.html
Copyright © 2011-2022 走看看