一。const与readonly的区别
1.都用来标示常量
2.赋初始值不同:const修饰的常量在声明时必须就赋值;readonly可以在初始化(声明或者构造函数)的过程赋值,其他地方不能赋值。
3.const字段是编译时常数,readonly可以用于运功行时常数:const 在编译时用字段的值来替换字段的位置,所以它的值必须在编译时是个能够计算出来的常数。但是readonly的值可以是运行时才知道,如伪代码 readonly mytime=datatime.now
4.const默认是静态的,readonly如果设置成静态,那必须显示声明。
5.const只能修饰值类型(不能是数组,struct),sting 和值为null的其他引用类型。readonly可以为任类型。
6.readonly只能修饰类的成员,不能修饰方法的局部变量,也不能修饰property等其他类成员。
7.本质上是常量但是无法用const的地方,可以用static readonly替换。
static readonly修饰的引用类型只是被限定不能赋值,但是对其成员的读写不会有限制。若是struct,那对其成员有限制。
二。访问权限修饰符
1.internal同一项目里面可以可以访问
2.protected internal:同一项目里面可以访问,子类里面可以访问
public | 公有访问。不受任何限制。 |
private | 私有访问。只限于本类成员访问,子类,实例都不能访问。 |
protected | 保护访问。只限于本类和子类访问,实例不能访问。 |
internal | 内部访问。只限于本项目内访问,其他不能访问。 |
protected internal | 内部保护访问。只限于本项目或是子类访问,其他不能访问 |
三。new 和override
1.子类用了override,强制转到父类,也调用用不了父类的方法,调用的还是子类重载过的方法。
2.子类用new,强制转到父类,则不会调用子类的方法。只会调用父类的方法。
四。abstract
抽象方法具有以下特性:
-
抽象方法是隐式的虚方法。
-
只允许在抽象类中使用抽象方法声明。
-
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:
public abstract void MyMethod();
-
实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。
1.params 关键字可以指定采用数目可变的参数的方法参数。
可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组。 还可以不发送参数。
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
2.out引用传递-不必初始化参数,ref必须初始化
六。值类型与引用类型
http://msdn.microsoft.com/zh-cn/library/4d43ts61(v=vs.90).aspx
值类型分配在堆栈上,包括:
-
所有数字数据类型
-
Boolean、Char 和 Date
-
所有结构,即使其成员是引用类型(没有默认无参数构造函数,可声明构造函数但是必须带参数,没有析构函数)
-
枚举,因为其基础类型总是 int,short……
引用类型分配在堆上,堆栈上只是一个地址。包括:
-
String
-
所有数组,即使其元素是值类型
-
类类型,如 Form
-
委托
将值类型转换为引用类型的过程称为装箱。装箱某个变量,就是创建一个引用变量,它指向堆上的新副本。引用变量是一个对象,因此,它可以使用每个对象都继承的所有方法(例如 ToString())。下面的代码进行了具体的说明:
int i = 67; // i is a value type object o = i; // i is boxed System.Console.WriteLine(i.ToString()); // i is boxed
在使用旨在用于对象的类时将会遇到取消装箱:例如,使用 ArrayList 存储整数。将某个整数存储在 ArrayList 中,即是对整数进行装箱。检索某个整数时,必须对它进行取消装箱。
System.Collections.ArrayList list = new System.Collections.ArrayList(); // list is a reference type int n = 67; // n is a value type list.Add(n); // n is boxed n = (int)list[0]; // list[0] is unboxed