zoukankan      html  css  js  c++  java
  • 关于C#中的弱引用

    本文前部分来自:http://www.cnblogs.com/mokey/archive/2011/11/24/2261605.html

    分割线后为作者补充部分。

    一:什么是弱引用

          了解弱引用之前,先了解一下什么是强引用

      例如 : Object obj=new Object();     就是一个强引用,内存分配一份空间给用以存储Object数据,这块内存有一个首地址,也就是obj所保存的数据,内存分配的空间中不仅仅保存着Object对象信息,还保存着自己(Object本身)被引用的次数。

      当一个对象被强引用的形式创建的时候,本身被引用的次数已经为1.

      接着Object o=obj; 这句代码执行之后,obj指向的Object的存储空间已经被引用了2次,所以Object保存的被引用数值为2.

      总结:强引用最终导致的结果就是被引用的对象的被引用次数+1;

      相反的弱引用就是不会对被引用对象的被引用次数有任何影响。

    二:弱引用有什么作用

      防止内存泄露。

      Object obj=new Object();

      当你在通过异步的形式访问网络上面的资源的时候,需要的时间可能会比较长,在数据返回之前,用户很可能转向了其他的页面,如果异步访问的对象(obj)对本地的一个对象(Object)是强引用的话,那么在这个异步访问对象(obj)被释放之前,也即在数据被回调之前,这个被引用的对象(Object)是不会被销毁的,这样一来,就导致内存一直被占用。

      WeakReference weakObj=new WeakReference(Object);

      此时就可以使用弱引用,弱引用对象(weakObj)发出异步请求,在回调之前,如果用户要转到其他的页面,这个被引用的对象(Object)是可以被释放的,这样子就不会出现内存一直被占用的现象。

    三:怎样使用弱引用

      弱引用类: WeakReference //有两个重载的构造函数

      WeakReference WeakObj=new WeakReference(Object);//弱引用方式

      IsAlive属性是判断此弱引用对象所引用的对象是否还存在,存在:IsAlive=True;

         Target属性是设置该弱引用对象所引用的数据对象的值

    ------------------------------------------------------------------------------

    在学习C#垃圾回收器时,看到对gc有如下总结:

    垃圾回收总结:

    1CLR提供了一种分代式、标记清除型GC,利用标记清除算法来对不同代龄的对象进行垃圾收集和内存紧缩,保证了运算效率和执行优化。

    2、一个对象未被其他任何对象引用,则这个对象被认为是可回收的

    3、最好不要通过调用GC.Collection来强制执行垃圾收集

    4、垃圾对象并非是立即被执行内存清理,GC可以在任何时候执行垃圾收集

    5、对“胖”对象考虑使用弱引用,以提高新能

    弱引用对象测试代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WeakReferenceTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                WeakReferenceTestClass xiaobao = new WeakReferenceTestClass(28, "xiaobao");
                WeakReferenceTestClass xiaoyu = new WeakReferenceTestClass(27, "xiaoyu");
    
                WeakReference weakReference = new WeakReference(xiaobao);
                WeakReferenceTestClass result = ((WeakReferenceTestClass)weakReference.Target);
                Console.Write(result.Name + "今年" + result.Age + "岁!");
    
                //Target:获取或者设置当前system.Reference对象应用的对象
                weakReference.Target = xiaoyu;
                result = ((WeakReferenceTestClass)weakReference.Target);
                Console.Write(result.Name + "今年" + result.Age + "岁!");
    
                //IsAlive:System.Reference弱引用对象应用的对象是否已经被回收——弱引用对象引用的对象是否还存在 true:存在  false:不存在 
                bool weakRefereceIsAlive = weakReference.IsAlive;
                Console.Write("System.Reference弱引用对象引用的对象是否被垃圾回收期回收:" + (weakRefereceIsAlive ?"尚未被回收":"已经被回收"));
    
                Console.ReadLine();
            }
        }
    
        public class WeakReferenceTestClass
        {
            public int Age { get; set; }
    
            public string Name { get; set; }
    
            public WeakReferenceTestClass(int age, string name)
            {
                this.Age = age;
                this.Name = name;
            }
        }
    }
    

      

  • 相关阅读:
    HDU 1261 字串数(排列组合)
    Codeforces 488C Fight the Monster
    HDU 1237 简单计算器
    POJ 2240 Arbitrage
    POJ 3660 Cow Contest
    POJ 1052 MPI Maelstrom
    POJ 3259 Wormholes
    POJ 3268 Silver Cow Party
    Codesforces 485D Maximum Value
    POJ 2253 Frogger(最短路)
  • 原文地址:https://www.cnblogs.com/zhouyunbaosujina/p/5323568.html
Copyright © 2011-2022 走看看