Share via


Bileşenleri Başlatma ve Sonlandırma

Bileþeniniz kurucusu tarafından başlatıldı (SubNew Visual Basic) ve onun yıkıcı tarafından bozdu (SubFinalizeVisual Basic).Bileşenin bir örneğini oluşturduğunuzda, bileşenin kurucusu çağrılır; kurucu bundan sonra çağrılamaz.Yıkıcı yeterlidir bileşeninizi atık toplama işlemi tarafından yok edilir ve kendi bellek iadesi önce çağrılır.

Visual Basic notuVisual Basic Notu

Önceki sürümlerinde Visual Basic Initialize ve Terminate olayları yapıcı ve yıkıcı aynı amaca hizmet.

Çöp toplama işlemi için bekliyor

Ortak dil çalışma zamanı bileşeni artık herhangi bir kod tarafından erişilmesi çöp toplama belirler sonra bileşeninizin 's yıkıcı çağırır.Böyle bileşenine yapılan tüm başvuruların serbest çalışıyorsa veya yalnızca başvuruları bileşeniniz için yürütülen tüm kodu aynı şekilde yalıtılmış olan nesneler tarafından tutulan, — örneğin, döngüsel başvurular olması durumunda.

Ek bir adım sizin bileşeniyle kullanıcı bittiğinde moment ne zaman kendi yıkıcı adlı anı arasında bir gecikme olabilir çünkü .net Çerçevesi bileşenlerinin yaşam tanıtılmaktadır: veritabanı bağlantıları veya Windows Sistem nesneleri işleme gibi sistem kaynaklarına bileşeninizin edinme, uygulamanız IDisposable arabirim ve sağlamak bir Dispose yöntemi bileşeninizin kullanıcıların kaynakları serbest bırakmak ne zaman seçebilmeniz.

Bir bileşenin yaşam döngüsü

Yazın başlatma: bileşeninizin ilk örneği oluşturulduğunda, yürüten ilk herhangi bir paylaştırılmış başlatma kodu kodudur.Paylaşılan herhangi bir üye başvuru yürütmek paylaşılan yapıcı da neden olur.Bu herhangi bir paylaşılan içerir başlatılır (üye değişkenleri) alanları ve paylaşılan yapıcı (SharedSubNew) varsa.Aşağıdaki kodda, bir referans fontu tüm sınıf için oluşturulur.

[!NOT]

Karşılık gelen C# anahtar Shared olan static, hangi ile karıştırılmamalıdır değil Static Visual Basic anahtar sözcüğü.

Public Class ADrawing
Shared ReadOnly ReferenceFont As New Font("TimesNewRoman", 14)
' Shared constructor does not overload other constructors.
Shared Sub New()
   ' There is no call to the base class's shared constructor.
   ' Insert code to initialize the shared data.
End Sub
End Class
class ADrawing
{
   static Font m_referenceFont = new Font("TimesNewRoman", 14);
   // Simply add the static keyword to create a static constructor.
   // Static constructors do not have any parameters.
   static ADrawing()
   {
      // There is no call to the base class's static constructor.
      // Code to initialize the font here.
   }
}

[!NOT]

Sınıf başlatma, bileşeninizi hiç örneği oluşturulan bile ortaya çıkabilir.Örneğin, bir abstract (MustInherit) paylaşılan üye işlevleri ile sınıf başlatıldı ve sınıf örneği oluşturulan rağmen bu işlevlerin uygulama tarafından kullanılabilecek.

  1. Oluşumu başlatma: kendi bileşen örneği oluşturulduğunda, başlatma kodu olan veri üyeleri başlatılmış ve uygun yapıcı aşırı yürütülür.Aşağıdaki kod bir özel alan başlatır ve herhangi bir parametre ve diğer kullanıcı parametreleri belirtmesi durumunda adlı varsa çağrılacak iki Kurucular tanımlar.

    Class AShape
       Private answer As Integer = 42
       Public Sub New()
          ' Call another constructor with default initialization values.
          MyClass.New(System.Drawing.Color.Red, 5280, DefinedSizes.Large)
       End Sub
       Public Overloads Sub New(myColor As Color, myLength As Integer, _
                Size As DefinedSizes)
          ' Insert code to initialize the class.
       End Sub
       ' Defines the DefinedSizes enum
       Public Enum DefinedSizes
          Large
          Small
       End Enum
    End Class
    
    class AShape
    {
       private int m_answer = 42;
       // Forward to another constructor.
       public AShape() 
       : this(System.Drawing.Color.Red, 5280, DefinedSizes.Large)
       {
          // Additional initialization goes here.
       }
    
       public AShape(Color color, int length, DefinedSizes size)
       {
          // Code to initialize the class goes here.
       }
       // Defines the DefinedSizes enum
       public enum DefinedSizes
       {
          Large,
          Small
       }
    }
    
  2. Kaynaklarını satarak: bileşeninizin kullanılıyorsa, IDisposable arabirimi, onu vermesi gereken bir Dispose sona erdiğinde istemci çağırmalıdır yöntemini bileşenini kullanma.Herhangi bir bileşeni, devraldığı olduğunu unutmayın Component bir varsayýlan uygulama, zaten Dispose, hangi geçersiz ek temizleme kod sağlamak için.De Dispose yöntemi, bileşeninizi onu ayrılmış, diğer nesnelere başvurular serbest bırakır ve kendisini kullanılamaz yapar tüm sistem kaynaklarını boşaltır.Ayrıca olabilir, kendi çağırmak bileşen için uygun olduğu Dispose yöntemi.Aşağıdaki kodu içeren bir bağımlı nesne disposal bir Dispose yöntemi.

    ' Assumes that the class implements IDisposable
    Public Sub Dispose() Implements IDisposable.Dispose
       myWidget.Dispose
       myWidget = Nothing
       ' Insert additional code.
    End Sub
    
    // Assumes that the class implements IDisposable
    public void IDisposable.Dispose()
    {
       mywidget.Dispose();
       mywidget = null;
       // Dispose of remaining objects.
    }
    
    

    Siz çağrısından sonra Dispose, böylece bileşenin bellek çöp toplama kazandıracaktır istemciniz bileşen kalan hiçbir başvuru serbest bırakmanız gerekir.

  3. Örnek imha: çöp toplama bileşenine geri kalan hiçbir başvuru olduğunu algıladığında, çalışma zamanı bileşeni 's yıkıcısını (FinalizeVisual Basic) ve belleği boşaltır.Temel sınıfın geçersiz kılıp kılmayacağını Finalize (Visual Basic) yöntemini veya bir yıkıcı (Visual C# için) kendi temizleme kodunu uygulamak, ancak her zaman yıkıcı bir çağrı ekleyin uygulamak ya da Finalize temel sınıf yöntemi.

    Protected Overrides Sub Finalize()
       m_Gadget = Nothing
       m_Gear = Nothing
       MyBase.Finalize()
    End Sub
    
    // In C#, a destructor is used instead of a Finalize method.
    ~ThisClass()
    {
       m_gadget = null;
       m_gear = null;
       // The base class finalizer is called automatically
    }
    

Ne zaman bir Dispose yöntemi uygulamak?

Bileþeniniz devraldığı, Component, varsayılan Dispose sağlanır.Bu uygulama özel temizleme kod sağlamak için geçersiz kılınabilir.Özel oluşturarak bileşeninizin oluşturuyorsanız, IComponent, uygulamanız IDisposable sağlamak için bir Dispose bileşeniniz için yöntem.

Bileþeniniz gereken bir Dispose , sistem nesneleri, veritabanı bağlantıları veya diğer önemli kaynaklar, ayırırsa yöntemi serbest bileşeniyle kullanıcı tamamlandı olarak.

Ayrıca uygulamanız bir Dispose bileşeniniz varsa diğer nesnelere başvurular tutuyorsa yöntemi Dispose yöntemleri.

Neden uygulamak elden mi?

Sistem etkinliğini bağlı olarak beklenmeyen aralığının bileşeninizi kullanan bir kullanıcı sona erdikten arasındaki süre geçmesini ve zaman çöp toplama bileşenin kodunun ulaşılamaz olduğunu algılar.Sağladığınız değil, bir Dispose yöntemi, bileşeninizi devam edecek bu zaman aralığında kaynaklarını tutacak.

En kötü durum senaryosu

Veritabanı Bağlantısı'nı kullanan ve sahip olmadığı bir sunucu bileşeni düşünün bir Dispose yöntemi.Büyük miktarda belleği olan bir sunucu üzerinde oluşturma ve birçok bileşen örneği boş bellek üzerinde ne kadar etkisi olmadan serbest bırakmak.Bu durumda, çöp toplama bileşenler onları başvuruları piyasaya sonra biraz zaman zarar verebilir değil.

Sonuçta, tüm kullanılabilir veritabanı bağlantıları serbest bırakılmış ancak değil bozdu bileşenleri bağlanması.Sunucu hiçbir bellek yetersizliği olduğu halde kullanıcı isteklerine yanıt verip vermediğini olabilir.

Ayrıca bkz.

Görevler

Nasıl yapılır: Tasarım Modunda Bileşenler Oluşturma ve Yapılandırma

Başvuru

Dispose

Finalize

Kavramlar

Bileşen Sınıfı Özellikleri

Visual Basic'te Bileşen Örneği Oluşturma Değişiklikleri