【发布时间】:2010-11-10 13:13:39
【问题描述】:
我的一个初级程序员创建了一个单例,但它的行为很奇怪:
我知道你不应该像这样访问对象,但他们就是这样做的,我无法解释为什么会发生这种情况 - 在调用 remove instance 之后,我在后面的行上放了一个断点,我仍然可以访问 someObject 对象及其属性。这种有意义,因为您访问 mySingleton 对象的引用,而不是 myInstance,...如您所见,我无法清楚地解释它,有人可以帮忙吗?
例如
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!
这是单例的伪代码:
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
就我个人而言,我不会像这样编写我的单例 - 我将实例对象作为一个单独的类。但每个人都有自己的。
【问题讨论】:
-
重点:
_myInstance的用法不是单例,也不是线程安全的。特别是如果那是 ASP.NET(或任何其他高度线程化的环境),您将会遇到混乱。 -
我忘了提 - 我希望在调用 remove instance 后会出现 null ref 异常...
-
@Marc - 是的,我知道,我已经简化了代码
标签: .net vb.net design-patterns language-agnostic