四
二是有的!
所有类型都是从System.Object派生
var o = System.Object;
o的方法
Equals : 判断是否相同
GetHashCode:得到一个hash码 也算是唯一标识吧
ToString:理论上是返回 String,重载专用
GetType:获取对象信息, 从安全考虑,非虚方法
上述为公开方法
下面是保护
MemberWiseClone: 创建一个新的实例,就是复制一个玩意儿 但是返回一个新的引用,引用的地址不一样~ (这段待查)
Finalizd: 垃圾回收~ 但是一般不会调用
New
1. 计算对象所需要的字节数(包含类型对象指针[tpye object pointer] 和 同步块索引[sync block index] 这两兄弟我倒是不知道他是什么..)
2.在堆上分配内存
3.初始化 1括号中两兄弟
4.调用构造
new完之后 返回一个引用
关于new完之后的回收:C# 没有显示释放的东东, 这玩意儿只能自动释放. 看clr心情
类型转换
作者说 clr的特性: 类型安全性. System.Object.GetType 因为他不能重载,所以不用将某类型伪装成另外一个类型
然后几种转换方式
1 public class aa { }
2
3 //失败后直接报错
4 var o = (System.Object)aa;
5
6 //as 只会有一次判断 而 != null这种判断相对开销较小
7 var o1 = aa as System.Object;
8 if(o1 != null) {}
9
10 //这种判断性能上消耗比较大
11 //首先他在if 中就检查了两次 1.首先合适aa 是否兼容 Object 2.判断aa 是否引用 Object
12 if(aa is System.Object) { var o2 = (System.Object)aa;}
运行时的相互联系
创建一个线程 会在栈上创建1MB的空间 用于定义内部变量和传递实参
void a()
{
var o = string.Empty;
a1();
var o1= "bbb";
}
void a1() { var o3= "333"; }
假设a 已经加载在线程中
prologue(开始和初始化)
他会在栈上面初始化1MB的空间,然后分配 o(string)的内存, 初始化
如果在a()中 是一个对象 而不是string 或者是值类型的话
就会在堆上创建相应对象(自然其中也有 类型指针对象 和 同步索引)
然后会返回在堆中的内存地址
a();
调用到a1(); 如果有参数 他会在栈中分配好参数的内存, 然后写入返回地址,也就是说当a1()执行完毕之后将要返回到得位置,然后继续执行a1里的东西,比如初始化局部变量,怎么怎么的
epilogue(结束和清扫工作)
清理,返回到调用者,比如a1就返回到之前为他分配的返回地址

浙公网安备 33010602011771号