Как Сборка "мусора" происходит для Классов, имеющих статические методы в C#/VB.NET?

Размер байта для типов не слишком интересен, когда только необходимо иметь дело с единственным языком (и для кода, которому Вы не должны напоминать сами о математическом переполнении). Часть, которая становится интересной, - когда Вы образуете мост между одним языком другому, C# к COM-объекту, и т.д., или Вы делаете некоторое смещение бита или маскирование, и необходимо напомнить себе (и Ваш обзор кода co-wokers) размера данных.

На практике, я обычно использую Int32 только для напоминания мне, какой размер они - то, потому что я действительно пишу управляемый С++ (для образования моста к C#, например), а также неуправляемый/собственный C++.

Long, поскольку Вы, вероятно, знаете, в C# 64 бита, но в собственном C++, он заканчивается как 32 бита, или символ unicode/16-bits, в то время как в C++ это - 8 битов. Но как мы знаем это? Ответ, потому что мы искали его в руководстве, и он сказал так.

Со временем и событиями, Вы начнете быть более добросовестными типом, когда Вы действительно запишете коды для образования моста между C#, и другие языки (некоторые читатели здесь думают, "почему был бы Вы?"), но по моему скромному мнению я полагаю, что это - лучшая практика, потому что я не могу помнить то, что я кодировал на прошлой неделе (или я не должен определять в своем документе API, что "этот параметр является целым числом на 32 бита").

В F# (хотя я никогда не использовал его), они определяют интервал , int32, и nativeint. Тот же вопрос должен повыситься, "который я использую?". Как другие упомянул, в большинстве случаев, это не должно иметь значения (должно быть прозрачным). Но я для можно было бы выбрать int32 и uint32 только для удаления неоднозначностей.

я предполагаю, что это просто зависело бы, на каких приложениях Вы кодируете, кто использует его, за чем, кодируя методы Вы и Ваша команда следуете, и т.д. для выравнивания по ширине, когда использовать Int32.

6
задан Jon Seigel 22 July 2010 в 21:53
поделиться

4 ответа

Если вы ' Если вы используете последнюю версию Django, вы можете использовать параметр unique_topting в модели UserToUserRole, а затем использовать метод get_or_create (), который показал Джо Холлоуэй. Это гарантирует, что вы не сможете получить дубликат.

Точно так же вы никогда не устанавливаете объект равным нулю. Вы можете сделать значение переменной нулевым, но это ничего не значит для любого объекта, на который ранее ссылалась переменная. Это просто означает, что в следующий раз, когда сборщик мусора будет искать живой объект, эта переменная не будет добавлять какой-либо объект в набор объектов, которые должны оставаться в живых в конце сборки мусора.

Я предлагаю вам прочитать Джеффри Прочтите статью Рихтера о сборке мусора , чтобы получить немного больше информации, а затем задайте дополнительные конкретные вопросы, когда вам нужно будет понять основы.

эта переменная не будет добавлять какой-либо объект в набор объектов, которые должны оставаться в живых в конце сборки мусора.

Я предлагаю вам прочитать статью Джеффри Рихтера о сборке мусора , чтобы получить немного больше информации, затем задайте дополнительные конкретные вопросы, когда вы разберетесь с основами.

эта переменная не будет добавлять какой-либо объект в набор объектов, которые должны оставаться в живых в конце сборки мусора.

Я предлагаю вам прочитать статью Джеффри Рихтера о сборке мусора для получения дополнительной информации, затем задайте дополнительные конкретные вопросы, когда вы разберетесь с основами.

11
ответ дан 8 December 2019 в 13:00
поделиться

Если вы спрашиваете, что происходит с объектами, на которые ссылаются переменные в статических методах, то эти объекты становятся доступными для сборки мусора, когда они больше не находятся в области видимости.

Если вы говорите об объектах, на которые ссылаются статические поля, то они, говоря простым языком, не будут собираться, пока для них не будет установлено значение null.

Следующий пример может лучше проиллюстрировать это:

class Example
{
    private static object field1 = new object();

    public static void SomeMethod()
    {
        object variable1 = new object();

        // ...
    }

    public static void Deref()
    {
        field1 = null;
    }
}

Объект, на который имеется ссылка by field1 будет создано при загрузке класса и останется корневым даже при создании и уничтожении объектов класса Example. Единственный способ собрать этот объектный мусор - это вызвать метод Deref (), который разыменует его, установив для ссылки значение null. (Фактически, можно выгрузить классы, выгрузив домен приложения, но это несколько более продвинутый вариант и не то, с чем вы, вероятно, столкнетесь так часто.)

И наоборот, статический метод SomeMethod () создает объект и ссылается на него с помощью переменной переменная1 . Этот объект доступен для сборки мусора, как только он выходит за пределы области видимости (в конце метода). Практически, его можно было бы собрать раньше, если бы остальная часть метода не использовала его.

4
ответ дан 8 December 2019 в 13:00
поделиться

объекты не помечены для GC. Они помечены (наличием переменной, которая ссылается на них или указывает на них) как НЕ быть мусором собраны. Когда каждая переменная или ссылка на объект во всех запущенных потоках, во всех глобальных статических переменных и во всех регистрах процессора была удалена, вышла за пределы области видимости или была установлена ​​на ноль, тогда объект больше не доступен, и GC заберет это.

3
ответ дан 8 December 2019 в 13:00
поделиться

Думайте о статических методах как о методах класса . Они доступны независимо от того, существует объект или нет. Они не влияют на сборку мусора.

0
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: