将一个对象的方法传递给另一个对象是否会使第一个对象保持活动状态?

尼罗芬

假设我有三个对象:“ a”,“ b”和“ c”。对象“ a”和“ c”是长期存在的,静态引用的服务单例。对象“ b”是短暂的,即没有静态引用可使它保持活动状态。

现在假设对象“ a”在其方法之一的范围内创建了对象“ b”的实例,例如

B b = new B();

进一步假设类B看起来像这样:

public B ()
{
    C.ActionList.Add ( SomeMethod );
}

void SomeMethod ()
{
...
}

现在,对象“ b”生存了多长时间?我的推测是,它超出了称为构造函数的方法的范围。具体来说,只要其方法仍在对象'c'的'ActionList'中即可。

那是对的吗?如果没有,它将被垃圾回收,当'c'运行其'ActionList'中的所有方法时会发生什么?

额外的问题:如果'b'上的方法不是命名的,而是匿名的,并在构造函数中编写如下,该怎么办:

public B ()
{
    C.ActionList.Add ( () => {
    ...
    } );
}
里德·科普西

具体来说,只要其方法仍在对象'c'的'ActionList'中即可。

对,那是正确的。实例方法的委托会为实例本身创建“硬引用”,并将其保持活动状态。您的第二个问题无关紧要。

请注意,这就是事件订阅是.NET中常见的“内存泄漏”来源的原因-从技术上讲,它们不是泄漏,但是事件订阅基于委托,并且具有相同的行为,因此事件订阅持有对实例。

如果'b'上的方法不是命名的,而是匿名的,并且在构造函数中以lambda编写,该怎么办?

都一样 如果lambda使用所讨论实例的状态,则它将被编译器转换为具有对该实例的引用的类型的实例方法,并保留一个引用。(请注意,如果某些lambda表达式不依赖于任何封闭的值,实例等,则有可能将其转换为静态方法,在这种情况下,该lambda表达式将不包含引用。)

在您的情况下,的内容...将确定这一点。如果您的表达式不过是:: () => { Console.WriteLine("Foo"); },则它不需要关闭实例中的任何值,也不需要使用有问题的实例,因此它不会保存引用。() => { Console.WriteLine(this.Foo); }但是,如果这样做,它将在类型上创建对的引用的方法this,并使类实例保持活动状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将一个类的对象传递给另一个类的方法

来自分类Dev

将一个对象内的值传递给另一个对象

来自分类Dev

将QBRTCSession对象从一个活动传递到另一个活动

来自分类Dev

比较对象与扩展第一个对象的另一个对象

来自分类Dev

将open调用作为参数传递给另一个函数后,文件对象是否关闭?

来自分类Dev

如何知道一个对象是否包含另一个对象

来自分类Dev

如何测试一个对象是否是另一个对象

来自分类Dev

测试一个对象是否依赖于另一个对象

来自分类Dev

如何检查一个对象是否包含另一个对象,例如

来自分类Dev

对象是否面对另一个

来自分类Dev

通过传递关系检查一个对象是否等于另一个对象

来自分类Dev

在清空第一个对象之前从另一个对象分配一个对象的字段

来自分类Dev

试图将一个对象的实例传递给另一个类

来自分类Dev

通过意图将BluetoothDevice对象传递给另一个活动

来自分类Dev

Android-将数组(对象的类)传递给另一个活动

来自分类Dev

将选定的对象传递给另一个活动

来自分类Dev

测试一个对象是否是另一个实例类型的子类

来自分类Dev

将对象传递给另一个类是否会创建一个新的单独对象?

来自分类Dev

C ++:如何将一个对象传递给另一个对象构造函数?

来自分类Dev

将一个对象结果传递给另一个对象函数(例如链)

来自分类Dev

Nashorn将Java对象传递给另一个Java方法

来自分类Dev

将多个 Java 对象数组传递给另一个方法

来自分类Dev

在cython中将c ++对象传递给另一个对象的方法的方法

来自分类Dev

在cython中将c ++对象传递给另一个对象的方法的方法

来自分类Dev

如何使用Intent将ArrayList <File>对象从一个活动传递到另一个活动?

来自分类Dev

从另一个对象创建一个对象是更好的做法

来自分类Dev

通过另一个类将对象传递给一个类

来自分类Dev

为什么我无法将此JSON对象传递给另一个活动

来自分类Dev

将对象传递给另一个活动(没有Parcelable?)

Related 相关文章

  1. 1

    将一个类的对象传递给另一个类的方法

  2. 2

    将一个对象内的值传递给另一个对象

  3. 3

    将QBRTCSession对象从一个活动传递到另一个活动

  4. 4

    比较对象与扩展第一个对象的另一个对象

  5. 5

    将open调用作为参数传递给另一个函数后,文件对象是否关闭?

  6. 6

    如何知道一个对象是否包含另一个对象

  7. 7

    如何测试一个对象是否是另一个对象

  8. 8

    测试一个对象是否依赖于另一个对象

  9. 9

    如何检查一个对象是否包含另一个对象,例如

  10. 10

    对象是否面对另一个

  11. 11

    通过传递关系检查一个对象是否等于另一个对象

  12. 12

    在清空第一个对象之前从另一个对象分配一个对象的字段

  13. 13

    试图将一个对象的实例传递给另一个类

  14. 14

    通过意图将BluetoothDevice对象传递给另一个活动

  15. 15

    Android-将数组(对象的类)传递给另一个活动

  16. 16

    将选定的对象传递给另一个活动

  17. 17

    测试一个对象是否是另一个实例类型的子类

  18. 18

    将对象传递给另一个类是否会创建一个新的单独对象?

  19. 19

    C ++:如何将一个对象传递给另一个对象构造函数?

  20. 20

    将一个对象结果传递给另一个对象函数(例如链)

  21. 21

    Nashorn将Java对象传递给另一个Java方法

  22. 22

    将多个 Java 对象数组传递给另一个方法

  23. 23

    在cython中将c ++对象传递给另一个对象的方法的方法

  24. 24

    在cython中将c ++对象传递给另一个对象的方法的方法

  25. 25

    如何使用Intent将ArrayList <File>对象从一个活动传递到另一个活动?

  26. 26

    从另一个对象创建一个对象是更好的做法

  27. 27

    通过另一个类将对象传递给一个类

  28. 28

    为什么我无法将此JSON对象传递给另一个活动

  29. 29

    将对象传递给另一个活动(没有Parcelable?)

热门标签

归档