《C#高级教程》学习笔记6

5.1.5命名约定
1泛型类型的名称用字母T作为前辍
2如果没有特殊要求,泛型类型允许用任意类替代,且只使用了一个泛型类型,就可以用字符T作为泛型类型的名称
3其它特定类型
public delegate void EventHandle<TEventArgs>(object sender,TEventArgs e);
public delegate TOutput Converter<TInput,TOutput>(TInput from);
public class SortedList<TKey,TValue>();

5.2创建泛型类
没用泛型:
public class LinkList:IEnumerable{
    public LinkedListNode First{get;private set;}
    public LinkedListNode Last{get;private set;}
    public LinkedListNode AddLast(object node){
        var newNode=new LinkedListNode(node);
        if(First==null){
            First=newNode;
            Last=First;
        }
        else{
            LinkedListNode previous=Last;
            Last.Next=newNode;
            Last=newNode;
            Last.Prev=previous;
        }
        return newNode;
    }
    public IEnumerator GetEnumerator(){
        LinkedListNode current=First;
        while(current!=null){
            yield return current.Value;
            current=current.Next;
        }
    }
}
//以上代码一开始放数字进去,后再放字符串,运行出错
泛型:
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<T>(node);
        if(First==null){
            First=newNode;
            Last=First;
        }
        else{
            LinkedListNode<T> 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();
    }
}
//以上代码入进去的类型不同会出现编译错误

5.3泛型类的功能
5.3.1默认值
类型T,默认值,引用类型为null,值类型为0
使用default(T);

5.3.2约束
 如果泛型类需要调用泛型类型中的方法,就必须添加约束,在<T>后面加
 几种约束类型:
where T:struct 对于结构约束,类型T必须是值类型
where T:class 类约束指定类型T必须是引用类型
where T:IFoo 指定类型T必须实现接口IFoo
where T:Foo 指定类型T必须派生自基类Foo
where T:new() 这是一个构造函数约束,指定类型T必须有一个默认构造函数
while T1:T2 这个约束也可以指定,类型T1派生自泛型类型T2,该约束也称为裸类型约束
有,分隔,可合用多个约束

5.3.3继承

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

5.4.泛型接口
十分复杂,研究了很久还是不太懂,以后弄懂了再来

第6章  数组
6.1同一类型的不同类型号的多个对象

6.2简单数组

6.2.1数组的声音明
int[] intArray;

6.2.2数组的初始化
myArray=new int[4];
int[] intArray=new int[4];
int[] intArray=new int[4]{2,5,6,4};
int[] intArray=new int[]{2,5,3,6};

6.2.3访问数组元素略

6.2.4使用引用类型略

6.3多维数组
int[,] twodim=new int[3,3];
twodim[0,0]=1;
……

int[,] twodim={
    {1,2,3},
    {4,5,6},
    {7,8,9}
};
三维数组类似

6.4锯齿数组
int[][] j=new int[3][];
j[0]=new int[2]{1,2};
j[1]=new int[5]{1,2,3,4,5};
j[2]=new int[8]{1,2,3,4,5,6,7,8};

6.5 Array类
6.5.1创建数组
Array是一个抽象类(后台会使用派生自Array的新类),不能用构造函数来创建数组
用CreateInstance()来创建数组
例:
Array intArray1=Array.CreateInstance(typeof(int),5);  //第一个参数是类型,第二是大小
for(int i=0;i<5;i++){
    intArray1.SetValue(33,i);
}
for(int i=0;i<5;i++){
    Console.WriteLine(intArray.GetValue(i));
}
还可以将已创建的数组强制转换声明为int[]的数组
int intArray2=(int[])intArray1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值