静态Static使用
-
用在类里的属性、方法前面,这样的静态属性与方法不需要创建实例就能访问,通过类名或对象名都能访问它,静态属性、方法只有“一份”:即如果一个类新建有N个对象,这N 个对象只有同一个静态属性与方法;
-
方法内部的静态变量:方法内部的静态变量,执行完静态变量值不消失,再次执行此对象的方法时,值仍存在,它不是在栈中分配的,是在静态区分析的, 这是与局部变量最大的区别;
-
一个类中如果存在静态构造函数,当程序运行时静态构造函数只执行一次;
- 与多态背道而驰,静态不允许实例化。
1 2 using System; 3 4 namespace teststatic1 5 { 6 class TestClass 7 { 8 static int i = getNumber(); 9 int j = getNumber(); 10 11 static int num = 1; 12 13 static int getNumber() 14 { 15 return num; 16 } 17 18 static void Main(string[] args) 19 { 20 Console.WriteLine("i={0}",i); 21 Console.WriteLine("j={0}", new TestClass().j); 22 Console.ReadKey(); 23 } 24 } 25 } 26
当执行第一个Console.ReadLine("i={0}",i);因为这里i是static变量,而且类class1是第一次被引 用,要先为TestClass里面所有的static变量分配内存。指令在逻辑还是一条一条的按顺序执行的,所以 先为static int i分配内存,并且在该内存中保持int的缺省值0,接着再为static int num 变量分配内存,值当然也为0。
然后执行第二步,为变量赋值:先为static int i变量赋值,i=getNumber(),看getNumber里面的代码,就是return num,这个时候num的值是0,于是i就为0了。然后对变量num赋值,num=1;这行代码执行后,num就为1了。
垃圾回收器
- 垃圾回收器回收什么?
- 什么东西能被垃圾回收器回收?
- 何时回收?
垃圾回收器何时回收的时间不确定,我们不知道它何时回收,但可以确定当我们使用的时候不可能进行回收。只有当我们程序里的一个变量长时间不用的时候,比如person p=new person(); p=null;这就标志垃圾回收器可以进行垃圾回收了,但也不知道垃圾回收器何时对垃圾进行回收。如果我们先让垃圾回收器立即对该变量在堆栈中开的空间马上回收,我们可以调用GC.Collect()马上对该变量进行回收。
垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。
1 Human h= new Human (); 2 h.Name = “sb"; 3 WeakReference wrf = new WeakReference(h); 4 h= null; 5 // GC.Collect(); 6 object o = wrf.Target; 7 if (o!=null) 8 { 9 Human h = o as Human; 10 Console.WriteLine(h.Name); 11 } 12 else 13 { 14 Console.WriteLine("只能重新创建了"); 15 } 16 Console.ReadKey();
垃圾回收的目的:提高内存利用率。
垃圾回收器,只回收托管堆中的内存资源,不回收其他资源(数据库连接、文件句柄、网络端口等)。
什么样的对象才会被回收?
没有变量引用的对象。没有变量引用的对象,表示可以被回收了(null),断了线的风筝,再也回不来了。
大学食堂(自己收盘子)、大排档(不需要程序员自己收盘子)
什么时间回收?
无法确定垃圾被回收的时间,当程序需要新内存的时候开始执行回收。
GC.Collect();//手动调用垃圾回收器。不建议使用,垃圾回收时会暂停一下(非常短暂)让程序自动去GC。
垃圾回收器中是以代进行划分的
垃圾回收器中“代”的概念:
共3代:第0代、第1代、第2代。
各代的回收频率:第0代最高,其次第1代,再次第2代。也就是说越老的对象生存几率越大。
.net中垃圾回收机制:mark-and-compact(标记和压缩),一开始假设所有对象都是垃圾。
除了内存资源外的其他资源怎么办?~或者Dispose();
弱引用:WeakReference,对于创建比较耗时的对象可以使用弱引用。
IsALive判断是否已死。
“大对象”,object o=new byte[85000];>=85000字节的对象被视为大对象,直接分配在第2代,GC.GetGeneration(o);不要为为短时间使用的对象创建大对象,否则频繁回收第2代。
1 Human h= new Human (); 2 h.Name = "yzk"; 3 WeakReference wkr = new WeakReference(h); 4 h= null; 5 //手动调用垃圾回收器。 6 //GC.Collect(); 7 object o = wkr.Target; 8 //IsAlive 9 if (o != null) 10 { 11 Console.WriteLine(((Person)o).Name); 12 } 13 else 14 { 15 Console.WriteLine("对象已经被回收!"); 16 } 17 Console.ReadKey();