目录
1. IList 接口与List的区别是什么?
2.泛型的主要约束和次要约束是什么?
5. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
6.有50万个int类型的数字,现在需要判断一下里面是否存在重复的数字,请你简要说一下思路。
7.数组有没有length()这个方法? String有没有length()这个方法?
8.一个整数List中取出最大数(找最大值)。不能用Max方法。
IList 泛型接口是 Icollection 接口的子代,并且是所有非泛型列表的基接口。Ilist 实现有三种类别:只读、固定大小、可变大小。无法修改只读 Ilist。固定大小的 Ilist 不允许添加或移除元素,但允许修改现有元素。可变大小的 Ilist 允许添加、移除和修改元素。
IList 是个接口,定义了一些操作方法这些方法要你自己去实现,当你只想使用接口的方法时,这种方式比较好.他不获取实现这个接口的类的其他方法和字段,有效的节省空间.
List 是个类型 已经实现了IList 定义的那些方法。
List List11 =new List ();
是想创建一个List,而且需要使用到List的功能,进行相关操作。 而
IList IList11 =new List ();
只是想创建一个基于接口IList的对象的实例,只是这个接口是由List实现的。所以它只是希望使用到IList接口规定的功能而已。
当一个泛型参数没有任何约束时,它可以进行的操作和运算是非常有限的,因为不能对实参进行任何类型上的保证,这时候就需要用到泛型约束。泛型的约束分为:主要约束和次要约束,它们都使实参必须满足一定的规范,C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满足约束条件。 (1)主要约束
一个泛型参数至多拥有一个主要约束,主要约束可以是一个引用类型、class或者struct。如果指定一个引用类型(class),那么实参必须是该类型或者该类型的派生类型。相反,struct则规定了实参必须是一个值类型。下面的代码展示了泛型参数主要约束:
public class ClassT1<T> where T : Exception
{
private T myException;
public ClassT1(T t)
{
myException = t;
}
public override string ToString()
{
// 主要约束保证了myException拥有source成员
return myException.Source;
}
}
public class ClassT2<T> where T : class
{
private T myT;
public void Clear()
{
// T是引用类型,可以置null
myT = null;
}
}
public class ClassT3<T> where T : struct
{
private T myT;
public override string ToString()
{
// T是值类型,不会发生NullReferenceException异常
return myT.ToString();
}
(2)次要约束 次要约束主要是指实参实现的接口的限定。对于一个泛型,可以有0到无限的次要约束,次要约束规定了实参必须实现所有的次要约束中规定的接口。次要约束与主要约束的语法基本一致,区别仅在于提供的不是一个引用类型而是一个或多个接口。例如我们为上面代码中的ClassT3增加一个次要约束:
public class ClassT3<T> where T : struct, IComparable
{
......
}
foreach( object arr in array)
{
arrayist.Add(arr);
}
数组:是存储同类型数据列表,数组在内存中是连续存储的。优点:存储、修改、读取速度快。缺点:初始化需要指定长度,无法扩展,插入数据麻烦
ArrayList:ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。优点:可扩展,无指定长度,可插入删除
缺点:因存储不同类型,执行装箱拆箱操作,读取、存储速度慢。
List:在数组和ArrayList基础上优化,存储通用类型数据列表。优点:可扩展示,初始化无需指定长度,可插入指定位置数据
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对像,equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
数组没有length()这个方法,有length的属性。String有有length()这个方法。
private static int GetMax(List<int> list)
{
int max = list[0];
for (int i = 0; i < list.Count; i++)
{
if (list[i]>max)
{
max = list[i];
}
}
return max;
}
C#中,所有异常都继承自System.Exception类,Exception类定义了C#异常应该具有的信息和方法。值得注意的属性有:
public virtual string Message { get; }// 错误的信息,文字描述
public virtual string StackTrace { get; }// 发生异常的调用堆栈信息
public System.Reflection.MethodBase TargetSite { get; }//引发这个错误的方法
public Exception InnerException { get; }// 子异常
根据类继承原则和异常处理原则,我们可以使用以下方式来自定义一个类:
public class CustomException : Exception
{
}