1、ArrayList:
构造函数:
ArrayList();初始化具有默认初始容量的新实例。
ArrayList(ICollection);把现有集合作为参数,将其内容复制到新实例中。
ArrayList(Int32);通过一个参数设置集合的容量,这个容量用一个int值指定,但这不是绝对的容量,如果集合中的项数超过了这个容量,容量会自动增加一倍。
代码如下:
ArrayList myal = new ArrayList(2);
myal.Add("1");
myal.Add("2");
myal.Add("3");
Console.WriteLine("长度:" + myal.Count + ";容量:" + myal.Capacity);
输出:长度:3;容量:4
可以通过ArrayList的FixedSize(ArrayList)创建一个具有固定大小的ArrayList。如:
ArrayList myal2 = ArrayList.FixedSize(myal);
Console.WriteLine("长度:" + myal2.Count + ";容量:" + myal2.Capacity);
输出:长度:3;容量:4
但是如果:myal2.Add("4"); 则会出现“System.NotSupportedException”异常,异常信息:“集合的大小是固定的。”
2、foreach循环和迭代器:
在foreach循环中,迭代一个collectionObject集合的过程如下:
(1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得,但这是可选的。
(2)调用所返回的IEnumerator接口的MoveNext()方法。
(3)如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性来获取对象的一个引用,用于foreach循环。
(4)重复前面两步(2,3),直到MoveNext()方法返回false为止,此时循环停止。
迭代器:迭代器是一个代码块,按顺序提供了要在foreach循环中使用的所有值。一般情况下是一个方法,但也可以使用属性访问器和其他代码块作为迭代器。
迭代器两种可能的返回类型是IEnumerator和IEnumerable,使用这两个类型的场合是:
(1)如果要迭代一个类,可使用方法GetEnumerator(),其返回类型是IEnumerator。
(2)如果要迭代一个类成员,例如一个方法,则使用IEnumerable。
3、浅度复制和深度复制:
可以使用受保护的方法System.Object.MemberwiseClone()进行浅度复制:
public class MyClass01
{
public int val;
}
public class MyClass02
{
public MyClass01 myclass=new MyClass01();
public MyClass02(int newVal)
{
myclass01.val=newVal;
}
public object GetValue()
{
return MemberwiseClone();
}
}
此时,通过GetValue()得到的浅度复制包括一个字段,它引用的对象与源对象相同。
.NET Framework 中实现深度复制的标准方式是实现ICloneable接口,该接口有一个Clone()方法,这个方法不带参数,返回一个object类型的结果:
public class MyClass01
{
public int val;
}
public class MyClass02 : ICloneable
{
public MyClass01 myclass=new MyClass01();
public MyClass02(int newVal)
{
myclass01.val=newVal;
}
public object Clone()
{
MyClass02 myclass02=new MyClass02(myclass.val);
return myclass02;
}
}
这次包含的对象是独立的。有时在比较复杂的对象系统中,调用Clone()是一个递归过程。