Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сборщик мусора C#

307
15 июля 2009 года
Artem_3A
863 / / 11.04.2008
День добрый, у меня возник такой вопрос - как поведет себе сборщик мусора если есть такой код

Код:
class SomeClass
{
    //...
    private static SomeClass obj = null;
    private SomeClass(){//...}
    public static SomeClass GetSomeClass
    {
         if(SomeClass.obj!=null) return SomeClass.obj;
         else return obj = new SomeClass();
    }
    //...
}
(в данном коде реализуется шаблон "одиночка")

на сколько я знаю объект класса удаляется в том случае если на него нет ни одной ссылки, однако в данном случае ссылка на класс всегда будет присутствовать! возможно решением будет следующий код

 
Код:
class SomeClass
{
    //...
    public static Clean()
    {
        obj = null;
    }
    //...
}


однако меня интересует поведение сборщика мусора в первом варианте, с нетерпением жду разъяснений и ваших комментариев!=)
5
15 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Artem_3A
День добрый, у меня возник такой вопрос - как поведет себе сборщик мусора если есть такой код

Будьте проще:

Код:
public sealed class SomeClass {

        private static SomeClass _instance = null;

        public static SomeClass Instance {
            get {
                if (ReferenceEquals(null, _instance))
                    _instance = new SomeClass();
                return _instance;
            }
        }

        private SomeClass() {
        }

    }
А теперь добавьте финализатор:
 
Код:
~SomeClass() {
        System.Console.WriteLine("Finalizing SomeClass instance");
    }
Далее посмотрите на вывод программы (запускать из консоли):
 
Код:
public static class Program {

        private static SomeClass some_class_ref;

        public static void Main() {
            some_class_ref = SomeClass.Instance;
        }
    }

После завершения исполнения домена приложения (в данном случае Default-домена) CLR просто сочтет все оставшиеся в живых объекты мусором и вызовет их финализаторы.
5
15 июля 2009 года
hardcase
4.5K / / 09.08.2005
Настоятельно рекомендую к прочтению:
http://rsdn.ru/article/dotnet/GC.xml
307
15 июля 2009 года
Artem_3A
863 / / 11.04.2008
ясно, значит данный объект будет висеть до конца работы приложения! относительно "быть проще", если честно не увидел особой разницы в моем и вашем коде, если не трудно, разъясните чем ваш код предпочтительней, дабы ликвидировать этот моей пробел знаний!=)))
307
15 июля 2009 года
Artem_3A
863 / / 11.04.2008
Цитата: hardcase
Настоятельно рекомендую к прочтению:
http://rsdn.ru/article/dotnet/GC.xml



спс, уже читаю, очень полезно!=)

12K
16 июля 2009 года
lifs
163 / / 06.09.2007
Добавлю еще один вариант написания Singleton'a (самый короткий):
 
Код:
...
        public static SomeClass Instance
        {
            get
            {
                return _instance ?? (_instance = new SomeClass());
            }
        }
        ...
66K
28 декабря 2010 года
alicesmile
1 / / 04.12.2010
Терминальный вариант - работать с Excel напрямую через COM интерфейсы.

АПД. Кстати Excel данные отображает коректно, но вот в ячейке они записаны с апострофом, по видимому, этим символизируется их принадлежность к строковому типу.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог