返回顶部
分享到

C#中弱引用使用介绍

C#教程 来源:互联网 作者:佚名 发布时间:2025-12-20 23:23:08 人浏览
摘要

弱引用(Weak Reference)是一种特殊的引用类型,它允许你引用一个对象,但不会阻止该对象被垃圾回收器(GC)回收。弱引用通常用于需要缓存或跟踪对象,但又不希望因保留引用而导致内存泄

弱引用(Weak Reference)是一种特殊的引用类型,它允许你引用一个对象,但不会阻止该对象被垃圾回收器(GC)回收。弱引用通常用于需要缓存或跟踪对象,但又不希望因保留引用而导致内存泄漏的场景。弱引用对小对象没有意义,因为弱引用有自己的开销,这个开销可能比小对象更大。

核心概念??

??与强引用的区别??:
??强引用??:普通对象引用(如 var obj = new MyClass())会阻止 GC 回收对象。
??弱引用??:不会阻止 GC 回收对象。当对象只有弱引用时,GC 可以随时回收它。
??用途??:
缓存大型数据(如图片、文件等),当内存不足时自动释放。
避免因长期持有对象引用而导致内存泄漏。
监听事件或观察对象生命周期,但不干预其回收。

使用:

1.基础使用:

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

public class WeakReferenceTest : MonoBehaviour

{

    WeakReference weakRef;

    // Start is called before the first frame update

    void Start()

    {

        // 创建一个对象

        var myObject = new TestWeakReferenceObj();

 

        // 创建弱引用

        weakRef = new WeakReference(myObject);

 

        // 解除强引用,只保留弱引用

        myObject = null;

 

        // 通过弱引用访问对象

        if (weakRef.IsAlive)

        {

            var obj = weakRef.Target as TestWeakReferenceObj;

            obj.DoSomething();

        }

        else

        {

            Debug.Log("对象已被回收");

        }

    }

 

    // Update is called once per frame

    void Update()

    {

        // 通过弱引用访问对象

        if (weakRef.IsAlive)

        {

            var obj = weakRef.Target as TestWeakReferenceObj;

            obj.DoSomething();

        }

        else

        {

            Debug.Log("对象已被回收");

        }

    }

}

 

class TestWeakReferenceObj {

    public void DoSomething()

    {

        Debug.Log("对象没有被回收");

    }

}

结果:

2.泛型使用:

代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

public class WeakReferenceTest : MonoBehaviour

{

    WeakReference<TestWeakReferenceObj> weakRefGeneric;

    // Start is called before the first frame update

    void Start()

    {

        weakRefGeneric = new WeakReference<TestWeakReferenceObj>(new TestWeakReferenceObj());

 

        if (weakRefGeneric.TryGetTarget(out TestWeakReferenceObj obj))

        {

            obj.DoSomething();

        }

        else

        {

            Debug.Log("对象已被回收");

        }

    }

 

    // Update is called once per frame

    void Update()

    {

        if (weakRefGeneric.TryGetTarget(out TestWeakReferenceObj obj))

        {

            obj.DoSomething();

        }

        else

        {

            Debug.Log("对象已被回收");

        }

    }

}

 

class TestWeakReferenceObj {

    public void DoSomething()

    {

        Debug.Log("对象没有被回收");

    }

}

结果:

适用场景:

??缓存??:缓存大型对象,但允许 GC 在需要时回收它们。
事件监听??:避免事件订阅导致的内存泄漏。
??对象生命周期跟踪??:观察对象是否存活,但不阻止其回收。

注:
性能??:频繁检查弱引用是否存在可能影响性能。
??不确定性??:对象可能在任何时候被回收,需始终检查 IsAlive 或 TryGetTarget。
??短期弱引用(Short Weak Reference)??:默认行为,GC 回收后弱引用自动失效。
??长期弱引用(Long Weak Reference)??:通过 WeakReference 构造函数指定 trackResurrection 为 true,可跟踪对象在终结后的状态(但极少使用)。

总结:

弱引用是 C# 中管理内存的一种高级机制,适用于需要灵活控制对象生命周期的场景。正确使用它可以优化内存使用,但需谨慎处理对象可能随时被回收的情况。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C#中弱引用使用介绍

    C#中弱引用使用介绍
    弱引用(Weak Reference)是一种特殊的引用类型,它允许你引用一个对象,但不会阻止该对象被垃圾回收器(GC)回收。弱引用通常用于需要缓
  • C++ move的作用介绍及陷阱最佳实践
    C++ move 的作用详解 这是个核心概念题!让我从浅到深给你讲清楚。 一、一句话总结 std::move的作用:将对象转换为右值引用,允许资源被移
  • C#借助Spire.XLS for .NET实现在Excel中添加文档属性
    在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色。然而,除了单元格中的数据,你是否曾关注过Excel文件的幕后信息文档属
  • Android实现监听手机开机事件的多种方法
    在开发Android应用时,有时我们需要在设备启动完成后执行某些操作,比如检查更新、同步数据等。为了实现这一功能,我们需要监听 设备的
  • 基于C++实现一个Windows多功能计算器
    功能特性 标准计算功能:提供基本数学运算,支持即时计算和表达式求值 科学计算功能:扩展数学运算,支持运算优先级和复杂函数计算
  • C#实现自动修复磁盘错误的方法
    秘诀1:文件完整性检查不是查,是自动补 现象: 普通代码只检查文件是否存在,但磁盘错误需要自动修复损坏的文件。 墨氏吐槽: 普通代
  • 使用C#实现自动化设置Excel表格中条件格式
    在日常的数据分析和报告工作中,Excel表格是不可或缺的工具。然而,当数据量庞大时,手动筛选、高亮关键信息变得异常繁琐且容易出错。
  • C#异步编程库AsyncEx的实现介绍
    在现代应用程序开发中,异步编程已经成为提升性能和响应能力的关键,尤其在处理网络请求、I/O 操作和其他耗时任务时,异步编程可以有
  • C#实现雪花算法(Snowflake Algorithm)
    在现代分布式系统中,生成全局唯一的标识符(ID)是一个非常重要的问题。随着微服务架构和分布式系统的普及,传统的单机数据库生成
  • 使用C#删除Excel表格中的重复行数据的代码

    使用C#删除Excel表格中的重复行数据的代码
    重复行是指在Excel表格中完全相同的多行数据。这些冗余行的存在可能源于多种原因,例如: 数据输入错误:用户在手动输入数据时,可能
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计