C#学习笔记 ----泛型

泛型的优点和缺点:

性能

类型安全

二进制代码的重用

代码的扩展

命名约定(字母T作为前缀)

创建泛型类型,如下:

public class LinkedListNode<T>
{
    public LinkedListNode(T value)
    {
        this.Value = value;
    }
    public T Value{get;private set;}
    public LinkedListNode<T> Next{get;internal set;}
    public LinkedListNode<T> Prev{get;internal set;}
}

public class LinkedList<T>:IEnumerable<T>
{
    public LinkedListNode<T> First{get;private set;}
    public LinkedListNode<T> Last{get;private set;}

    public LinkedListNode<T> AddLast(T node)
    {
        var newNode = new LinkedListNode(node);
        if(First == null)
        {
            First = newNode;
            newNode.Prev = Last;
            Last = First;
        }
        else
        {
            LinklistNode previous = Last;
            Last.Next = newNode;
            Last = newNode;
            Last.Prev = previous;
        }
        return newNode;
    }

    public IEnumerator<T> GetEnumerator()
    {
        LinkedListNode<T> current = First;
        while(current != null)
        {
            yield return current.Value;
            current = current.Next;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

泛型类的功能

在泛型中,根据泛型类型是引用类型还是值类型,泛型default用于将泛型类型初始化为null或0。

泛型支持几种约束机制:

where T:struct 对于结构约束,类型T必须是值类型

where T:class 类约束指定类型T必须是引用类型

where T:IFoo 指定类型T必须实现接口IFoo

where T:new() 这是一个构造函数约束,指定类型T必须有一个默认构造函数

where T1:T2 这个约束也可以指定,类型T1派生自泛型类型T2。该约束也称为裸类型约束。

使用泛型类型还可以合并多个约束

泛型类的静态成员只能在类的一个实例中共享

泛型接口

泛型结构

Nullable<T>

结构Nullable<T>定义了一个约束:其中的泛型类型T必须是结构

如下:

public struct Nullable<T>
    where T:struct
{
    public Nullable(T value)
    {
        this.hasValue = true;
        this.value = value;
    }
    private bool hasValue;
    public bool HasValue;
    {
        get
        {
            return hasValue;
        }
    }
    private T value;
    public T Value;
    {
        get
        {
            if(!hasValue)
            {
                throw new InvalidOperationException("no value");
            }
            return value;
        }
    }

    public static explicit operator T(Nullable<T> value)
    {
        return value.Value;
    }

    public static implicit operator Nullable<T>(T value)
    {
        return new Nullable<T>(value);
    }

    public override string ToString()
    {
        if (!HasValue)
            return String.Empty;
        return this.value.ToString();
    }
}

定义可空类型的变量,使用“?”

泛型方法

时间: 2024-08-25 04:56:12

C#学习笔记 ----泛型的相关文章

swift学习笔记-&gt;泛型

如果学过java就知道泛型是什么  比如说定义一个数组  var a : [Int] Int 就是该数组的泛型 创建一个字典也是根据泛型储存内容的 var a : Dictionary <String,String> 而泛型能解决的问题  就像字典一样  他是个不确定的键值对  你定义什么类型就能存什么类型 泛型函数 下面举个例子一个函数  要将两个参数值互换 func myswap(inout a: Int,inout b: Int) { let temp = a a = b b = tem

Java学习笔记——泛型

如果T既要继承类又要指定接口,使用下面方式: public class some<T extends Iterable<T> & Comparable<T>>{} Java的泛型不具有共变性(如果B是A的子类,而Node<B>可视为一种Node<A>,则称Node具有共变性),不过可以使用类型通配字符?与extends来声明变量,使达到类似的共变性. Node<Apple> apple = new Node<>(n

学习笔记——泛型

泛型的意义:泛型用来保证类型的统一,主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性.1.类型安全,通过设置泛型,可以让编译器验证类型2.消除强制转换.如果不用泛型,将元素从容器中取出时,都是由object类型向目标类型强制转换.而由于泛型的擦除,所有的泛型类型变量都会被替换为原始类型,在获取的时候,集合会实现变量的强制转换,转换是隐式的. 泛型类:public class Test<T> 泛型接口:public interface Generator<T

【DAY12】第十二天集合&泛型&IO学习笔记

hash:散列 ------------------ Hashset集合内部是通过HashMap进行实现的.使用的是HashMap中key部分. 对象在添加进集合中时,首选会对hashcode进行处理(hashcode右移16位和 自身做异或运算)得到一个经过处理的hash值,然后该值和集合的容量进行 &运算,得到介于0和集合容量值之间一个数字.该数字表示着数组的下标. 也就是该元素应该存放在哪个元素中. Map与Collection -------------- Map与Collection在

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

C++ Primer 学习笔记_83_模板与泛型编程 --一个泛型句柄类

模板与泛型编程 --一个泛型句柄类 引言: [小心地雷] 这个例子体现了C++相当复杂的语言应用,理解它需要很好地理解继承和模板.在熟悉了这些特性之后再研究这个例子也许会帮助.另一方面,这个例子还能很好地测试你对这些特性的理解程度. 前面示例的Sales_item和Query两个类的使用计数的实现是相同的.这类问题非常适合于泛型编程:可以定义类模板管理指针和进行使用计数.原本不相关的Sales_item类型和 Query类型,可通过使用该模板进行公共的使用计数工作而得以简化.至于是公开还是隐藏下

Java学习笔记_26_泛型概述

                                                               泛型概述 在Java中存入容器中的对象再取出时需要转换类型,因为对象加入容器会被转换成Object类型,而取出时要转换成实际类型.但向  下类型转换都 是存在潜在危险的,因此应该尽量避免它们.  Java的泛型: 所谓泛型就是在定义(类.方法.形参.成员变量等等)的时候,指 定它们为通用类型,也就是数据类型可以是任意类型. 泛型为提高大型程序的类型安全和维护带来了很大的潜

C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用的迭代器类型.比方,假设形參必须为随机訪问迭代器则可提供vector或 deque类型的迭代器,或者提供指向数组的指针.而其它容器的迭代器不能用在这类算法上. C++还提供了另外两种算法模式:一种模式由算法所带的形參定义;还有一种模式则通过两种函数命名和重载的规范定义. 一.算法的形參模式 大多数的