Почему происходит такое одиночное поведение? - PullRequest
3 голосов
/ 10 ноября 2010

Один из моих младших программистов создал синглтон, но он действует странно:

Я знаю, что вы не должны получать доступ к объекту, как это, но это то, как они это сделали, и я не могу объяснить,почему это происходит - после вызова удаления экземпляра я ставлю точку останова после строки, и я все еще могу получить доступ к объекту 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!

Вот код 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 ]

6 голосов
/ 10 ноября 2010

Это потому, что вы только удалили ссылку MySingleton._myInstance на объект.

x все еще имеет ссылку на этот объект.

Редактировать:
Чтобы уточнить:

это как:

var A = new Class();
var B = A;
A = null;
// Here B still has that reference to the created object
4 голосов
/ 10 ноября 2010

Первая строка получает ссылку на ваш синглтон, и эта ссылка останется действительной до тех пор, пока объект не будет собран мусором. Однако до тех пор, пока есть ссылки на объект, он не будет собирать мусор, поэтому у вас будет ссылка на действительный объект, пока вы явно не назначите x чему-либо другому.

1 голос
/ 10 ноября 2010

В целом, в .NET вы никогда не можете явно / детерминистически установить объект в ничто.Вы можете только установить его ссылки на Nothing, а затем разрешить сборщику мусора его очистить.Как уже говорилось, в исходном коде вы фактически сохранили ссылку на него, присвоив ему значение x.

В общем случае установка объекта на Nothing или null не рекомендуется, поскольку объект пригоден для сборки мусора послепоследняя ссылка;среда выполнения замечает это.Например, если у вас есть такой код:

Dim anObject as new MyObject

anObject.DoAnOperation()
[1]
... 
...
'more code
...
...

Set anObject = Nothing
[2]

Если вы не установили для объекта значение Nothing, он будет иметь право на сбор в любое время после точки [1].Если вы это сделаете, он не имеет права до пункта [2].Если ваш метод занимает много времени, он может стать важным.

Дополнительная информация:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...