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。
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。