1.C#中也有抽象类,用abstract修饰,里面含有用abstract修饰的方法:
abstract class A
{
public abstract void F();
}
abstract class B: A
{
public void G() {}
}
class C: B
{
public override void F() {
// actual implementation of F
}
}
2.装箱(boxing)和取消装箱(unboxing)
可以把任何对象赋值给Object(c#和c++一样支持赋值兼容),但把值类型赋给引用类型时,涉及到装箱和取消装箱。
Object obj = 1;//装箱,在堆中申请一个对象,把1装到堆中
也可显式装箱:
Object obj = (Object)1;
例子:
int i = 123;
object o = i;
i = 456;//o仍然是123,应为o的实际值在堆上,和i不在同一个地方。
取消装箱:
int j = (int)o//把堆上的值拷贝到栈上,也可隐式unboxing
3.string类型不可改变,要是想用可变的字符串,请使用StringBuider
4.out,ref使参数引用传递
out:可以把一个未初始化的值传递
ref:必须是先初始化,再作为参数传递
成员变量不可和out一起传递
out,ref两者不参与区分重载
out/ref和没有out/ref区分重载
调用和声明时都要写out/ref关键字
5.
void changeArray(int[] arr)
{
arr = new int[2]{1,2};
}
void Test()
{
int theArray = new int[2]{0,0};
changeArray(theArray);//返回后theArray还是{0,0},因为changeArray中的arr指向了另一个数组
}
因为引用变量也是值传递的
如果changeArray写成
void changeArray(ref int[] arr)
则theArray会变成{1,2},因为引用变量也是引用传递了
6.class必须用new定义object,但可以先声明,如:
class1 a;
a = new class1();
7.struct声明变量时不用struct关键字
8.arry的声明:
int[] arrTemp = {1,2}
或
int[] arrTemp;
arrTemp = new int[2] 9.即使不用new,array和string也是引用类型:
int[] arrTmp = {1,2}
int[] arrTmp2 = arrTmp
arrTmp2[1] = 3;//同时改变了arrTmp
10 引用类型初始化为NULL,值类型初始化为0
11 如果不想引用类型关联改变,必须用深拷贝,如数组用CopyTo
12 ArrayList可以操作任何object类型的数据
13 is操作用来判断一个变量是否属于某个类型 if (a is int)
14 使用as做转换时的安全检查
Object a = "abc";
if(a is string)
{
string b = (string)a
}
和
Object a = "abc";
string b = a as string;//如果没有转成功,会给b赋值为null
if(b != null) {
......
}
15 finally不论catch到与否,也不论是否有异常发生都会执行
try {
console.writeline("abc");
return;
}
catch //catch不带任何东西,表示捕捉所有异常 {
....
}
finally
{
....//会在return后执行
}
.....//try中有return了,就不会执行了
如果没有catch捕捉,只用try和finally,发生异常后还是会异常终止。
16 如果一个名称和c#变量关键字冲突,可在前加@,如class@class