Что такое жизненный цикл объекта .NET?

Каков жизненный цикл объекта для объекта в .NET?

Из того, что я понимаю, это:

Объект создан - вызывается конструктор (если он существует)Методы / Свойства / Используемые поляОбъект уничтожен - удаление вызвано (если оно существует)Деструктор вызван GC в какой-то момент
 1800 INFORMATION15 июн. 2009 г., 12:39
Обратите внимание, что это не называется "деструктор", но "финализатор"
 Marc Gravell♦15 июн. 2009 г., 12:41
2 строго необязательно ...object обычно используется как синхронизирующая блокировка, но к ней никогда не обращаются члены.

Ответы на вопрос(9)

а в VB.NET они вызываются после конструктора.

Время выполнения не гарантирует вызоваFinalize вообще.

Утилизировать и завершить для очисткиunmananged только ресурсы. Попытка очистить управляемые ресурсы в финализаторе, например, вызов Dispose для внутренних участников доставит вам неприятности, потому что они, возможно, уже были завершены.

Мне нравится делать вещи простыми и просто использовать финализатор, чтобы обнаружить и записать неприятное сообщение об ошибке, призывающее разработчика исправлять код. Пытаясь выяснить, безопасно ли делать работуDispose предполагалось, что слишком легко ошибиться и обычно не стоит тратить время на циклы.

загрузить сборкувыполнить статические инициализаторы"новый звонок:выделить памятьвыполнить нестатические инициализаторывыполнить конструкторэкземпляр теперь готов к использованиюпосле исчезновения последней ссылки на объект: если у объекта нет финализатора, он теперь готов к сбору; если объектимеет финализатор, он помещается в очередь финализатора.(необязательно) объекты из очереди финализатора имеют свой финализатор, вызываемый в специальном потоке; если из приложения до сих пор нет ссылки на объект, теперь он также становится пригодным для сборки мусорасборщик мусора освобождает память

Как уже отмечали другие,Dispose() должен вызываться пользователем, так как среда выполнения не влияет на него.

 Matthew Whited27 июн. 2009 г., 20:49
Следует отметить, что если финализатору требуется слишком много времени для запуска, поток будет прерван без каких-либо уведомлений или исключений
 David Schmitt07 янв. 2010 г., 11:59
msdn.microsoft.com/en-us/library/k9x6w0hc.aspx явно заявляет: «вызывается автоматически перед созданием первого экземпляра или ссылками на любые статические элементы»
 Bert Huijben05 янв. 2010 г., 16:05
статические конструкторы не обязательно инициализируются в этом порядке. Я думаю, что единственной гарантией является то, что они вызываются до доступа к статическим переменным в этом классе. Но это может быть после конструктора.

вания ctor:

class Foo {  
    public Foo() {
        message += "; ctor";
    }
    string message = "init";
    public string Message { get { return message; } }
}
static class Program {
    static void Main() {
        Foo foo = new Foo();
        Console.WriteLine(foo.Message); // "init; ctor"
        Foo bar = (Foo)System.Runtime.Serialization.FormatterServices
            .GetSafeUninitializedObject(typeof(Foo));
        Console.WriteLine(bar.Message); // null
    }
}
 rein15 июн. 2009 г., 13:06
Не то, чтобы я мог видеть, когда вы будете или должны использовать это, но +1 за то, что научил меня чему-то классному
 Marc Gravell♦15 июн. 2009 г., 13:35
Это в основном используется BinaryFormatter во время десериализации

он вызывается в первый раз, и объект этого типа создается или на него ссылаются

У каждого класса есть один, так как один будет сгенерирован компилятором, если вы сами его не кодируете. И первое, что это делает (если не указано иное), это вызывает ctor своего родительского типа.

Вот подробное описание вопроса. Во-первых, Dispose не вызывается во время выполнения, вы должны вызывать его самостоятельно. Также нет деструкторов, но есть финализаторы: если объект переопределяет метод Finalized, он вызывается, когда объект больше не доступен для приложения. Может случиться, что во время финализации объект снова становится доступным (например, сохраняет ссылку на себя в глобальном объекте), поэтому он возвращается к шагу 2 вашей модели. В объекте GC также есть методы, которые позволяют пользователю завершать управление объектом.

 David Schmitt15 июн. 2009 г., 16:11
Спасибо, это было очень интересное чтение.
 Sander Rijken15 июн. 2009 г., 15:22
Они могут, но просто не делают этого. Видетьblogs.msdn.com/clyon/archive/2006/04/25/583698.aspx
 David Schmitt15 июн. 2009 г., 13:01
Я думал, что финализаторам больше не разрешается трогать управляемое пространство. По крайней мере, это было мое чтение официального шаблона IDispose, который специально разделяет управляемые и неуправляемые ресурсы для финализатора.
Решение Вопроса

Вам нужно позвонить или использовать блок, например.

using(Stream s = File.OpenRead(@"c:\temp\somefile.txt"))
    // Do something with s

Финализатор вызывается GC, только если он существует. Наличие финализатора приводит к тому, что ваш класс собирается в 2 этапа; сначала объект помещается в очередь финализатора, затем вызывается финализатор и объект собирается. Объекты без финализаторов собираются напрямую.

Рекомендация состоит в том, что Dispose избавляется от управляемых и неуправляемых ресурсов, а финализатор очищает только неуправляемые ресурсы. Когда метод Dispose высвободил неуправляемые ресурсы, он может вызвать GC.SuppressFinalize, чтобы избежать долгой жизни объекта, который будет помещен в очередь финализатора. ВидетьMSDN для правильного образца образца утилизации.

Жизненный цикл объекта

Создание объекта: Вы используетеновый ключевое слово для создания экземпляра нового объекта.

Блок памяти выделен. Этот блок памяти достаточно большой, чтобы удерживать объект. (CLR обрабатывает выделение памяти для управляемых объектов)Блок памяти преобразуется в объект. Объект инициализирован. (Вы можете контролировать этот шаг, реализуя конструктор)

Уничтожение объекта: Вы используете разрушение, чтобы восстановить любые ресурсы, используемые этим объектом.

Объект очищен; например, путем освобождения любых неуправляемых ресурсов, используемых приложением, таких как файловые дескрипторы и соединения с базой данных. (Вы можете контролировать этот шаг, внедрив деструктор.)Память, используемая объектом, восстанавливается.

CLR обрабатывает освобождение памяти, используемой управляемыми объектами; однако, если вы используете неуправляемые объекты, вам может потребоваться вручную освободить память, используемую этими элементами.

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

/*********************************
 * Author:  Theofanis Pantelides *
 *   Date:  23 Jun 2009          *
 *********************************/

using System;
using System.IO;

public class MyClass : IDisposable
{
    String oFile;
    Stream oStream;

    public MyClass(String _File)
    {
        oStream = File.OpenRead(oFile = _File);
        // Initialize
    }

    ~MyClass()
    {
        this.Dispose();
        // Destruct
    }

    public void doSomething()
    {
        // do Whatever it is you are trying to do
    }

    #region IDisposable Members

    /// <summary>
    /// Dispose all resources used by instance of class
    /// and update Garbage Collector information
    /// </summary>
    public void Dispose()
    {
        if (oStream != null)
        {
            oStream.Dispose(); // Dispose using built in functions
            GC.SuppressFinalize(oStream); // No need for Garbage Collector
        }

        oStream = null;  // Nullify it.
    }

    #endregion
}

Использование:

using(MyClass mc = new MyClass(@"c:\temp\somefile.txt"))
{
  mc.doSomething();
}

Вы даже можете использовать одно и то же объявление дважды, так как оно не существует вне «использования».

using(MyClass mc = new MyClass(@"c:\temp\somefile.txt"))
{
  mc.doSomething();
}

using(MyClass mc = new MyClass(@"c:\temp\somefile.txt"))
{
  mc.doSomething();
}
 Matthew Whited27 июн. 2009 г., 20:46
Если вы хотите, чтобы один класс объяснил весь жизненный цикл, вы должны добавить статическое поле и статический конструктор.

Ваш ответ на вопрос