你的位置:首页 > 软件开发 > ASP.net > C#中考虑为大对象使用弱引用

C#中考虑为大对象使用弱引用

发布时间:2016-04-21 14:00:07
1.无论怎样尽力,我们总是会使用到某些需要大量内存的数据,而这些内存并不需要经常访问。或许你需要从一个大文件中查找某个特定的值,或者算法需要一个较大的查询表。这时,你也许会采用2中不太好做法:第一种是创建一个本地变量,然后在每次执行该算法时都生成一大块垃圾;第二种则是创建一个成员 ...

  1.无论怎样尽力,我们总是会使用到某些需要大量内存的数据,而这些内存并不需要经常访问。或许你需要从一个大文件中查找某个特定的值,或者算法需要一个较大的查询表。这时,你也许会采用2中不太好做法:第一种是创建一个本地变量,然后在每次执行该算法时都生成一大块垃圾;第二种则是创建一个成员变量,在很长一段时间内都占用着这一大块内存。很多时候这两种做法都不是非常好。

  2.有没有一种好的选择来处这个问题呢?答案是创建弱引用,弱引用的对象和垃圾对象差不多,程序会告诉垃圾收集器该对象可以被回收,不过在回收之前你仍旧有一个引用,可以用来在需要的时候访问到该对象。若能合理使用该策略,弱引用将和垃圾收集器协同工作,从而优化内存使用。如下代码说明:

  /// <summary>  /// 大对象类型  /// </summary>  public class MyLargeClass  {    private int[,] matrix;    private ushort matrixXDimension;    private ushort matrixYDimension;    public get='_blank'>string reallyLongMessage;    private static WeakReference _weakObj;    public static object WeakObj    {      get      {        return _weakObj?.Target;//“?.”语法为C#6.0的新特性,对应.Net Framework 4.6。表示若为空则返回空,若不为空则获取其相应的属性值      }      set      {        _weakObj = new WeakReference(value);//弱引用的创建      }    }    public MyLargeClass(ushort matrixXDimension, ushort matrixYDimension)    {      this.matrixXDimension = matrixXDimension;      this.matrixYDimension = matrixYDimension;      matrix = new int[matrixXDimension, matrixYDimension];    }    private void Initialize()    {      //TODO 做更多的数据初始化      //对matrix二维数组的数据加载    }    public long Calculate()    {      //TODO 处理对matrix对象计算结果      return matrixXDimension * matrixYDimension * 1000;    }    public static void Execute()    {      //从弱引用中获得大对象,若没有弱引用或弱引用已被回收,此时就需要重新创建对象。      MyLargeClass myLargeObject = WeakObj as MyLargeClass;//myLargeObject可为本地变量,也可为成员变量      if (myLargeObject == null)      {        myLargeObject = new MyLargeClass(1000, 1000);      }      //TODO 对myLargeObject对象中的数据进行处理      //处理完成后,把大对象归到弱引用,然后把myLargeObject设置为null,表明大对象无引用。此时,系统会认为myLargeObject所指向的对象可以被垃圾收集。若垃圾收集器在此时运行,那么将会回收该对象。不过若是在回收之前,你再次需要该对象,只需如上面的4行代码处理即可。      WeakObj = myLargeObject;      myLargeObject = null;    }}

原标题:C#中考虑为大对象使用弱引用

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录