1.结构 使用struct关键字来定义1个结构,级别与类保持一致,写在命名空间下面
结构中可以定义 字段 属性 方法 构造函数 也可以通过new关键字来创建对象
结构里面的字段不能赋初始值 结构里面不能定义一个没有参数的构造函数
在构造函数中必须要给结构体的所有字段赋值
在构造函数中为属性赋值,不认为是对字段赋值,因为属性不一定是对字段操作的
结构是一个值类型的,在传递结构变量的时候,会将结构对象里的每一个字段复制一份然
后拷贝到新的结构变量的字段中
声明结构体对象可以不new关键字,但是这个时候结构体对象的字段没有初始值,因为没
有调用构造函数,而构造函数中必须为字段辅助,所有通过new关键字创建结构体对象,
这个对象的字段就有默认值了
2.被CLR管理的代码叫做托管代码
不被CLR管理的代码叫做非托管代码
分配在栈空间的变量一旦执行完其所在的作用域,这个变量就会被CLR立即回收
分配在堆里面的对象,当没有任何变量引用它的时候,这个对象就被标记为”垃圾对象”等
待垃圾回收器回收
GC会定时的清理堆空间中的垃圾对象
GC清理垃圾对象的频率 程序员无法决定CLR会自动控制
当一个对象被标记为”垃圾”的时候,这个对象不一定会立即回收
GC.GetGeneration(变量名); 得到指定的对象所在的代
GC.Collect()立即让垃圾回收器对所有的代进行回收
析构函数
不能有访问修饰符 不能有参数
在对象被垃圾回收器回收的时候 析构函数被GC自动调用
执行一些清理善后的操作的时候,会用到析构函数
3.静态成员, 是被static关键字修饰的 是属于类的,通过类名.静态成员来访问
实列成员,没有被static关键字修饰的 是属于对象的,通过对象名.实例成员来访问
实例成员属于对象
在这个类第一次被加载的时候,这个类下面的所有的静态成员会被加载
静态成员只被创建一次,所以静态成员只有一份,实列成员有多少对象就被创建多少次
静态成员会被创建在静态存储区中,一旦创建直到程序退出才会被回收
变量需要被共享的时候,方法需要被反复调用的时候可以把方法定义为静态成员
在静态方法中不能直接调用实列成员,因为静态方法被调用的时候对象还有可能不存在
this/base关键字在静态方法中不能使用,因为有可能对象还不存在
可以创建这个类的对象指定对象的成员在静态方法中操作
在实列方法中,可以调用静态成员,因为这个时候静态成员肯定存在
4.静态成员和实例成员的对比
a) 生命周期不一样
b) 在内存中存储的位置不一样
5.静态类 被static关键字修饰
a) 静态类中只能声明静态成员
b) 静态类中不能有实例构造函数
c) 静态类不能被实例化,因为没有实例成员,实列化没意义
d) 静态类不能被继承
e) 静态类的本质是一个抽象的密封类,所以不能被继承也不能被实例化
f) 如果一个类下面的所有成员都需要被共享,那么就可以把这个类定义为静态类
g) 不能声明一个类型的变量
6.静态构造函数
a) 非静态类也可以有静态构造函数
b) 这个类的成员第一次被访问的之前,就会执行静态构造函数
c) 静态构造函数只被执行一次,
7.继承
a) 子类拥有父类所有的成员
b) 创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类对象所有字段开辟空间,只不过父类私有的成员子类访问不到
c) 子类从父类继承父类所有的非私有成员
d) Base关键字可以调用父类的非私有成员
e) 子类的访问级别不能比父类的高、
f) 创建子类对象的时候1.调用子类的构造函数2.调用父类的构造函数3.执行父类的构造函数4.执行子类的构造函数
g) 子类的构造函数后面默认加了一个:base()通过这个调用父类的无参数的构造函数
h) 如果父类没有无参数的构造函数,将会报错,因为子类的构造函数默认会调用父类的无参构造函数
i) 使用base()关键字可以显示的指定子类构造函数调用父类有参的构造函数
j) 为什么要调用父类的构造函数
k) 为什么优先于本类的构造函数执行
l) 继承的特征
i: 单根性 类只有一个父类
ii: 传递性
iii: object所有的类都直接或者间接的从object继承
m)只要有1个功能不是子类所需要的,子类就不应该继承
n) 父类与子类在同名成员的时候,如果创建一个子类对象,调用这个子类对象的同名方法,会调用子类的
o) new关键字的第二个作用,隐藏父类的同名成员
原文:http://www.cnblogs.com/WZLYA/p/4838563.html