一.集合
集合类一般用户处理对象列表,其功能比简单数组要多,功能大多是通过实现System.Collections命名空间的接口获得。数组是该命名空间中System.Array类的实例,它只是集合类的一个类型。
| 简单数组 | ArrayList类 |
类名 | System.Array | System.Collection.ArrayList |
特点 | 引用类型,需要初始化大小,并逐项赋值 | 大小可变,无需初始化大小 |
定义 | Animal [] animalArray=new Animal[2] | ArrayList animalArrayList=new ArrayList(); |
赋值 | animalArray[0]=new Chicken("ken"); | animalArrayList.Add(new Chicken("Roy")); |
统计大小 | animalArray.Length() | animalArrayList.Count; |
数据类型 | 数组的类型是Animal,可以直接使用 | 无数据类型,需强制转换成Aniaml |
ArrayList的其他方法有:
Remove(myCow2):删除myCow2对象
RemoveAt(0):删除第一个对象
AddRange(animalArray):把数组animalArray中的对象添加到集合中
IndexOf(myCow2):myCow2的索引值
1.定义集合
定义集合可以从一个类中派生自己需要的集合,如System.Collections.CollectionBase类
2.索引符
为实现类似于数组的访问,需用集合的索引符属性
3.迭代器
集合类可以使用foreach循环访问集合的内容,也可以用foreach循环访问定制类的内容,最简单的方式是用迭代器。具体实现方式为:
1).使用yield关键字选择要在foreach循环中使用的值:
yield return value;
2).如果要迭代一个类,用接口类型 Ienumerator,使用方法GetEnumerator(),其返回类型是Ienumerator
3).要迭代一个类成员,如使用一个方法,则使用接口IEnumerable
二.比较
对象之间的比较有两类:
1).类型比较:确定对象是什么,或者对象继承了什么
2).值比较:在比较对象的值时,必须从一开始就定义比较的含义
1.类型比较
类型比较的方法有:
1).myObj.GetType== typeof(MyComplexClass)方法
2).is运算符
1).封箱和拆箱
1>.封箱(boxing):把值类型转换为System.Ojbec类型,或转换为由值类型实现的接口类型。如:
eg1: struct MyStruct
{
public int Val;
}
//封箱
MyStruct valTypel=new MyStruct();
valTypel.Val=5;
object refType=valTypel;
注:以上述方式封箱,refType包含值类型变量的一个副本的引用,而不包含源值类型变量的引用。修改原值不影响refType内封装的内容
eg2:把值类型封装到一个接口类型中
interface IMyInterface
{
}
struct MyStruct: IMyInterface
{
public int Val;
}
//封箱
MyStruct valType1=newMyStruct();
IMyInterface refType=valType1;
//拆箱
MyStruct ValType2=(MyStruct)refType;
2>.拆箱(unboxing):boxing的逆向操作,即把转换后的变量强制类型转换成值类型所在的类型
2).is运算符
功能:检查对象是否是给定类型,或者是否可以转换为给定类型,如果是则返回true
语法:<operand> is <type>
表达式结果:
1>.如果<tpye>是一个类类型,而<operand>也是一个类类型,或者它继承了该类型,或者它可以封箱到该类型中,则结果为ture.
2>.如果<type>是一个接口类型,而<operand>也是该类型,或者它是实现该接口的类型,则结果为true.
3>.如果<type>是一个值类型,而<operand>也是该类型,或者它可以拆箱到该类型中,则结果为true.
2.值比较
1).运算符重载
语法:给类添加运算符类型成员(必须为static),一般操作数的类型与运算符的类型相同。也可以使用混合类型,但注意不要把相同签名的运算符添加到多个类中。并且重载的参数类型和顺序也要正确。
eg:常在如下类型的 + 方法
public class AddClass1
{
public int val;
//重载 +运算符
public static AddClass1 operator + (AddClass1 op1,AddClass1 op2)
{
AddClass1 returnVal=new AddClass1();
returnVal.val=op1.val+op2.val;
return returnVal;
}
}
上述重载后即可被使用,如下:
AddClass1 op1=newAddClass1();
opt1.val=5;
AddClass1 op2=newAddClass1();
opt2.val=6;
AddClass1 op3=opt1+opt2;
可以重载的运算符有:
>.一元运算符:+,-,!,~,++,--,true,false
>.二元运算符:+,-,*,/,%,&,|,^,<<,>>
>.比较运算符:==,!=,<,>,<=,>=
注:<和>必须成对重载
2).使用IComparable和IComparer接口
1>.Icomparable在要比较的对象的类中实现,可以比较当前对象与另一个对象
IComparable提供一个方法CompareTo(),该方法接受一个对象,返回一个int值
2>.IComparer在一个单独的类中实现,用于比较任意两个对象
IComparer提供一个方法Comparer(),这个方法接受两个对象,返回一个int值
三.转换
1.重载转换运算符
用关键字implicit和explicit来指定转换
2.as运算符
语法:<operand> as <type>
注意:<operand>的类型可能是<type>,或<operand>可以隐式转换为<type>,或者<operand>可以封箱到<type>类型中