【C#数组、泛型和集合介绍】
1.数组声明和初始化
第一种方法:int[] myArray;(声明) myArray = new int[4];(初始化)或者一句话:int[] myArray = new int[4];
第二种初始化方法:使用数组初始化器:int[] myArray = new int[4] { 4, 7, 11, 2 };
当然,如果使用花括号初始化数组,还可以不指定数组的大小,因为编译器会计算出元素的个数。int[] myArray = new int[] { 4, 7, 11, 2 };
终极版本:使用C#编译器还有一种更简化的形式:int[] myArray = { 4, 7, 11, 2 };
2.访问数组元素
数组在声明和初始化后就可以用索引器访问其中的元素了。
通过索引器传送元素符号,就可以访问数组。索引器总是以0开头,表示第一个元素。
如果不知道数组中元素的个数,则可以在for语句中使用Length属性。
fro( int i = 0; i< myArray.Length; i++) { Console.WriteLine(myArray[i]); }
出了使用for语句进行迭代数组中的所有元素之外,还可以使用foreach语句
foreach( int item in myArray ) { Console.WriteLine(item); }
注意:用索引器访问数组最好先判断数组是否越界,否则运行时会抛出System.IndexOutOfRangeException: 索引超出了数组界限
3.数组和集合接口:
IEumerble接口:是由foreach语句用于迭代数组的接口。
ICollection接口:是派生自IEumerable接口,主要用于确定集合中元素的个数,或用于同步。
IList接口:派生于ICollection接口,Array类实现IList接口的原因是:IList接口定义了Item属性,可以使用索引器访问元素。
4.枚举
在foreach语句中使用枚举,可以迭代集合中的元素,而无需知道集合中元素的个数。
5. 委托
.Net以委托形式实现了类似于C/C++中的函数指针的概念。
委托是一种特殊的对象类型,其特殊之处在于,我们以前定义的对象都包含数据,而委托只是包含方法的的地址。
6. 在C#中声明委托
在C#使用一个类时,一般分两步。首先需要定义这个类,即告诉编译器这个类是有什么字段和方法组成;然后(静态方法除外)实例化类的一个对象。
同理,使用委托时,也需要经历两步。
首先:要定义使用的委托,对于委托,定义它就是告诉编译器这种类型的委托代表了哪种类型的方法;
然后:创建该委托的一个或多个实例。
定义委托的语法如下:
delegate void IntMethodInvoker(int x) |
delegate double TwoLongOp(long first, long second) |
delegate string GetString() |
总结:其语法类似于方法的定义,但是没有方法体,定义的前面要加上关键字delegate。
因为定义委托基本上是定义一个新类,所以说可以在定义类的任何地方定义委托,既可以在另一个类的内部定义,也可以在任何类的外部定义,还可以在命名空间中把委托定义为顶层对象。
根据定义的可见性,可以在委托上添加一般的访问修饰符:public, private, protected等。
public delegate double TwoLongOp(long first, long second) |
7. 匿名方法
匿名方法是用作委托参数的一个代码块。
在Javascript中,你可以这样写:foo.bar(function(x){ return x < 2;}); 怎么样?够长吧?有没有发现function和return关键字有些多余。
在C#中,我们可以这样写:foo.Bar(x => x < 2);
8. lambdaλ表达式
λ表达式可用于委托类型。
就是这一坨:x => x < 2
CTS:通用类型系统