19, C#的数组
C#的数组都是对象,继承自Array类,故都拥有属性及方法,如Rank,数组的维数,equals等。而java中的数组只有一个length属性。 Array intArray1 = Array.CreateInstance(typeof(int), 5); 等同于:int[] intArray1 = new int[5]; int[] intArray2 = (int[])intArray1;
除一般数组外,C#支持不规则数组如: int[][] jagged = new int[3][];
jagged[0] = new int[2] { 1, 2 };
jagged[1] = new int[6] { 3, 4, 5, 6, 7, 8 };
jagged[2] = new int[3] { 9, 10, 11 };
20,操作符:
is 判断左是否是右类型
as 类型转换
21,运算符重载
Vector x = new Vector ( 1,1 ); Vector y = new Vector (2,2)
Vector z = x + y // 或者用point z = x.add( y ); 但显然前者更直观。
实现:方法为public , static 运算符前加operator: public static Vector operator + (Vector lhs, Vector rhs)
{
Vector result = new Vector(lhs);
result.x += rhs.x;
result.y += rhs.y;
result.z += rhs.z;
return result;
} //此时 x + y会执行此方法,实际上,当出现运算符时,c#都先在左,右操作数的方法找是否具有重载此操作符的方法,且此方法参数与给出的操作符左右操作数相同,若相同,执行之。
x = 2 * x public static Vector operator * (int lhs, Vector rhs)
{
Vector result = new Vector(lhs);
result.x = 2 * rhs.x;
result.y += 2 * rhs.y;
return result;
} 若是x = x * 2 则不会执行,因为形参不匹配,此时需要再定义一个 public static Vector operator * (Vector rhs,int lhs )
{
return lhs * rhs;
}
能重载的运算符有: +, *, /, -, %
+, -, ++, —
&, |, ^, <<, >>
!, ~true, false
==, !=,>=, <=>, <, //没有 = 此外: true false;== !=; > <; >= <=; 重载时重载一个,另一个必须重载且返回结果要为boolean ,在重载了 + 之后相当于重载了+= ,+=不能显式重载
22, 委托 --- 类是数据,方法也可当做数据,也能被赋值。
using System;
public partial class AA
{
public delegate string show( string name );
public string list( string name )
{
return "hdello world " + name;
}
public static void Main(){
AA a = new AA();
//show _show = new show(a.list);
show _show = a.list;
Console.Write(_show("123"));
Console.Write(a.go( _show ));
}
public string go( show _show ){
return _show("345");
}
}
委托可当做类来看待,即委托方法就是一个类,可用new来创建,同js,不同js的方法当成类还可以有属性。
委托不要方法体, 前要加关键字 delegate
调用:委托方法 + 括号, 直接用,不用创建对象引用。
方法当做变量来看,在赋值,传参时当然不要用(), 只有在调用时才用()
委托还可以进行 + , - 操作,一次运行多个方法,但方法返回值最好为void,否则后者会将前者覆盖掉
using System;
public partial class AA
{
public delegate void show( string name );
public void list( string name )
{
Console.Write("hdello world " + name);
}
public void list1( string name )
{
Console.Write( "list1 world " + name);
}
public static void Main(){
AA a = new AA();
show _show = a.list;
_show += a.list1;
_show("123");
}
}
23,集合
Hashtable ht = new Hashtable();
foreach (DictionaryEntry de in myHT) {
Console.Write( dr.key + dr.value );
}
取值: ht["name"]
//注意,因为HashTable是按散列排序,不是数据那种位置类的,故它的输出与add的位置不同。
IList接口 List 提供范型 List
java中接口与范型都是List