代码之家  ›  专栏  ›  技术社区  ›  Mr Shoubs

为什么会发生这种单粒子行为?

  •  3
  • Mr Shoubs  · 技术社区  · 15 年前

    我的一个初级程序员创建了一个singleton,但它的行为很奇怪:

    例如

        Dim x As MySingleton = MySingleton.GetInstance()
    
        x.someObject.int = 5
        x.someObject.str = "hello"
    
        Console.Out.WriteLine(x.someObject.int.ToString)
        Console.Out.WriteLine(x.someObject.str.ToString)
    
        MySingleton.RemoveInstance()
    
        Console.Out.WriteLine(x.someObject.int.ToString) //still exists!
        Console.Out.WriteLine(x.someObject.str.ToString) //still exists!
    

    这是单例的Psuedo代码:

    Public Class MySingleton
    
        Private Shared _myInstance As MySingleton
    
        Public someObject As New Class1
    
        Public Shared Function GetInstance() As MySingleton
            If _myInstance Is Nothing Then
                _myInstance = New MySingleton
            End If
            Return _myInstance
    
        End Function
    
        Public Shared Sub RemoveInstance()
            _myInstance = Nothing
        End Sub
    
    
        End Class
    

    就我个人而言,我不会像这样写我的单例——我把实例对象作为一个单独的类。但每个人都有自己的想法。

    3 回复  |  直到 15 年前
        1
  •  1
  •   chaos    15 年前

    一般来说,在.NET中,永远不能显式/确定地将对象设置为空。您只能将其引用设置为“无”,然后允许垃圾收集器清理它。如前所述,在原始代码中,您实际上通过将引用分配给x来保留对它的引用。

    一般来说,不建议将对象设置为Nothing或null,因为对象在最后一次引用之后有资格进行垃圾收集;运行时会注意到这一点。例如,如果您有这样的代码:

    Dim anObject as new MyObject
    
    anObject.DoAnOperation()
    [1]
    ... 
    ...
    'more code
    ...
    ...
    
    Set anObject = Nothing
    [2]
    

    更多信息:

    http://msdn.microsoft.com/en-us/library/ee787088.aspx

        2
  •  6
  •   Albin Sunnanbo    15 年前

    是因为你只删除了 MySingleton._myInstance

    x 仍然有对该对象的引用。

    编辑:

    就像是:

    var A = new Class();
    var B = A;
    A = null;
    // Here B still has that reference to the created object
    
        3
  •  4
  •   Jackson Pope    15 年前

    第一行获取对singleton的引用,该引用将保持有效,直到对象被垃圾回收为止。但是,只要仍然有对某个对象的引用,它就不会被垃圾收集,因此在显式地将x赋给其他对象之前,您将继续拥有对有效对象的引用。

    推荐文章