Klasa vs. Składnik vs. Formant
W tym temacie opisano składnika i kontroli; dyskusji przedstawiony tu powinny pomóc zdecydować, kiedy należy zaimplementować klasę składnika lub formantu.
[!UWAGA]
Ten temat jest o Windows Forms i klas ASP.NET.Tej dyskusji nie stosuje się do klas WPF, aby uzyskać informacje dotyczące tworzenia formantów WPF, zobacz Omówienie tworzenia formantu.
Poniższa lista zawiera ogólne wytyczne dla implementacji.
Jeśli klasa używa zasobów zewnętrznych, ale nie będą używane na powierzchni projektu, realizacji System.IDisposable, lub pochodzi od klasy, która implementuje bezpośrednio lub pośrednio IDisposable.
Jeśli klasa będzie używany na powierzchni projektu (na przykład Windows Forms lub Web Forms designer), System.ComponentModel.IComponent, lub pochodzi od klasy, która implementuje bezpośrednio lub pośrednio IComponent.Należy zauważyć, że IComponent rozszerza IDisposable, więc IComponent jest zawsze typu IDisposable typu.IComponent Typ ma wydajność małych napowietrznych nad IDisposable typu, który nie jest IComponent, ale zazwyczaj jest to równoważona zdolność do witryny IComponent w czasie projektowania i w czasie wykonywania.(Lokalizacja jest wyjaśnione w dalszej części tego tematu.)
Jeśli klasa, która jest designable (używane na powierzchni projektowania) i jest organizowany przez odwołanie może pochodzić od System.ComponentModel.Component.ComponentImplementacja podstawowego IComponent typu, który jest organizowany przez odwołanie.
Jeśli chcesz designable klasy, która jest organizowane przez wartość może pochodzić od System.ComponentModel.MarshalByValueComponent.MarshalByValueComponentImplementacja podstawowego IComponent typu, który jest organizowany przez wartość.
Jeśli chcesz wprowadzić IComponent wpisz w hierarchii modelu obiektu i nie może pochodzić od realizacji podstawowych, takich jak Component lub MarshalByValueComponent z dziedziczenia pojedynczego wykonania IComponent.
Jeśli chcesz klasy designable, który udostępnia interfejs użytkownika klasy jest formantem.Formant musi pochodzić z jednej z klas podstawowych kontroli bezpośrednio lub pośrednio: System.Windows.Forms.Control lub System.Web.UI.Control.
[!UWAGA]
Jeśli klasa nie jest ani designable ani nie przechowuje zasobów zewnętrznych, nie musisz IComponent lub IDisposable typu.
Postępuj zgodnie z definicji składnika, kontroli, kontener i witryny.
Składnik
W .NET Framework, składnik jest klasa, która implementuje System.ComponentModel.IComponent interfejsu lub który pochodzi bezpośrednio lub pośrednio z klasy, który implementuje IComponent.W programowaniu składnik termin jest zazwyczaj używany dla obiektu wielokrotnego użytku i mogą współdziałać z innymi obiektami.A .NET Framework składników spełnia te wymagania ogólne i dodatkowo zapewnia funkcje, takie jak kontrolować zasoby zewnętrzne i pomoc w czasie projektowania.
Kontrolowanie zasobów zewnętrznych
IComponent Rozszerza interfejs IDisposable interfejs, który ma metodę o nazwie Dispose w jego umowie.W realizacji Dispose metody, składnik musi jawnie zwolnić zasoby zewnętrzne.Zapewnia to sposób deterministyczny zwolnić zasoby, w odróżnieniu od rodzaju oczyszczania domyślne, co się dzieje w kolekcji garbage.Deweloperzy muszą propagować Disposecałej hierarchii zamknięcia do zapewnienia, że dzieci składnik również zwolnić zasoby.Ponadto należy wywołać składnik pochodne Dispose metody jej klasy podstawowej.
[!UWAGA]
Nawet gdy podać jawne kontrolę nad zasobami za pośrednictwem Dispose, należy zawsze zapewniać niejawna Oczyszczanie poprzez finalizatorów (destruktora), aby uniemożliwić wyciek trwale, jeśli użytkownik nie wywołać zasobów Dispose na składnik.
Poniższy przykład pokazuje wzorzec dla wykonania Dispose w podstawowy składnik i składnik pochodnych.
public class BaseComponent : IComponent {
// IComponent extends IDisposable.
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
}
// Simply call Dispose(false).
~BaseComponent(){
Dispose (false);
}
}
// Derived component.
public class DerivedComponent : BaseComponent {
protected override void Dispose(bool disposing) {
if (disposing) {
// Free other state.
}
// You must invoke the Dispose method of the base class.
base.Dispose(disposing);
// Free your own state.
...
}
// No finalizer/destructor.
// No Dispose() method.
}
' Design pattern for a base class.
Public Class BaseComponent
Implements IComponent
' Implement IDisposable
Public Overloads Sub Dispose()
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overloads Overridable Sub Dispose(disposing As Boolean)
If disposing Then
' Free other state (managed objects).
End If
' Free your own state (unmanaged objects).
' Set large fields to null.
End Sub
Protected Overrides Sub Finalize()
' Simply call Dispose(False).
Dispose (False)
End Sub
End Class
' Design pattern for a derived component.
Public Class DerivedComponent
Inherits BaseComponent
Protected Overloads Overrides Sub Dispose(disposing As Boolean)
If disposing Then
' Release managed resources.
End If
' Release unmanaged resources.
' Set large fields to null.
' Call Dispose on your base class.
Mybase.Dispose(disposing)
End Sub
' The derived class does not have a Finalize method
' or a Dispose method with parameters because it inherits
' them from the base class.
End Class
Obsługa projektowania
Ważną cechą składników w .NET Framework to designable, co oznacza, że klasa, która jest składnikiem można w środowisku programowania (RAD) aplikacji takich jak Visual Studio.Składnik można dodać do przybornika z Visual Studio, może być przeciągany i upuszczany na formularz i może operować na powierzchni projektu.Uwaga bazowy czasu projektowania wsparcie dla IComponent typów jest wbudowana w .NET Framework; Deweloper składnika nie trzeba wykonywać żadnych dodatkowych działań, aby wykorzystać podstawowe funkcje projektowania.
Aby uzyskać informacje o pomocy technicznej w czasie projektowania, zobacz Atrybuty projektowania składników i Rozszerzenie wsparcia w czasie projektowania.
Obsługujący składnik
Składnik można znajdować (obsługiwanych) w kontenerze (zdefiniowaną w dalszej części tego tematu).Gdy składnik jest zlokalizowany, współdziała z kontenera za pośrednictwem jego witryny (zdefiniowaną w dalszej części tego tematu) i ma możliwość wykonywania kwerend i uzyskać usług z jego kontenera, za pośrednictwem witryny.W celu zapewnienia, że zasoby są zwalniane, gdy kontener jest programowy, kontener musi implementować IDisposable interfejsu.W realizacji Dispose metody, kontener musi zwolnić wszystkie zasoby, które posiada i wywoływać Dispose metoda poszczególne składniki zawarte.
Zamknięcia jest logiczna i nie wymagają wizualną reprezentację.Kontener średniego poziomu, który witryny składniki bazy danych jest przykładem niewizualne zamknięcia.Wizualne zamknięcia jest widoczne w projektancie Windows Forms i Projektant formularzy sieci Web w Visual Studio.Powierzchnia projektu visual jest obsługujący składnik formularza (w części strony formularzy sieci Web).
Kierowanie składnika
Składniki mogą być lokalnie lub nonremotable.Lokalnie składniki są organizowane przez odwołanie lub wartość.Kierowanie obejmuje wysłanie obiektów przez granice, takich jak Domen aplikacji (lekki procesy), procesy i nawet maszyny.Gdy obiekt jest organizowany przez odwołanie, tworzony jest serwer proxy, który umożliwia zdalne wywołania obiektu.Gdy obiekt jest organizowane przez wartość, szeregowana kopia obiektu jest przesyłane przez odpowiednie obramowanie.
Składniki lokalnie hermetyzowania zasobów systemowych, które są duże lub że istnieje jako odniesienia należy zorganizować pojedynczych wystąpień.Klasa bazowa dla składników, które są organizowane przez odwołanie jest System.ComponentModel.Component.Implementuje tej klasy bazowej IComponent i pochodzi od MarshalByRefObject.Wiele składników w .NET Framework Biblioteka klas pochodzić od Component, w tym System.Windows.Forms.Control (klasa bazowa dla formantów Windows Forms), System.Web.Services.WebService (klasa bazowa dla usług XML sieci Web utworzone przy użyciu ASP.NET), i System.Timers.Timer (klasa generuje zdarzenia cyklicznego).
Lokalnie składniki, które po prostu przytrzymaj Państwa powinny organizowane przez wartość.Klasa bazowa dla składników, które są organizowane przez wartość jest System.ComponentModel.MarshalByValueComponent.Implementuje tej klasy bazowej IComponent i pochodzi od Object.Tylko kilka składników w .NET Framework Biblioteka klas pochodzić od MarshalByValueComponent.All such components are in the System.Data namespace (DataColumn, DataSet, DataTable, DataView, and DataViewManager).
[!UWAGA]
Podstawy klas dla obiektów, które są organizowane przez wartość i odniesienia są Object i MarshalByRefObject, odpowiednio, ale odpowiednich klas pochodnych są o nazwie MarshalByValueComponent i Component.Logiki schemat nazewnictwa jest, że najczęściej używanych typów ma prostszej nazwy.
Jeśli składnik nie będzie zdalnym sterowaniem, pochodzi z podstawowej implementacji dla Component; Zamiast tego wykonania IComponent bezpośrednio.
Formant
Formant jest składnik, który zapewnia (lub włącza) funkcje interfejsu użytkownika (UI)..NET Framework Oferuje dwie klasy podstawowej dla formantów: jeden dla formantów Windows Forms po stronie klienta, a drugą dla ASP.NET formanty serwera.These are System.Windows.Forms.Control and System.Web.UI.Control.Wszystkie formanty w .NET Framework Biblioteka klas wynikać bezpośrednio lub pośrednio z tych dwóch klas.System.Windows.Forms.Controlpochodzi z Component i sama zapewnia funkcje interfejsu użytkownika.System.Web.UI.Controlimplementuje IComponent i zapewnia infrastrukturę, na którym jest łatwo dodać funkcjonalność interfejsu użytkownika.
[!UWAGA]
Każdy formant jest składnikiem, ale nie jest to PRAWDA.
Kontener i witryny
Jeśli składniki i formantów dla Windows Forms lub stronach formularzy sieci Web (ASP.NET stron), nie trzeba implementować pojemników lub witryn.Projektanci formularzy sieci Web i Windows Forms są kontenerami dla Windows Forms i ASP.NET formanty serwera.Pojemniki świadczenia usług składników i zlokalizowane w obrębie ich kontroli.W czasie projektowania formantów ulokowanych w projektancie i uzyskania usług z projektanta.Dla kompletności definicje kontenera i witryny są podane poniżej.
Container
Kontener jest klasa, która implementuje System.ComponentModel.IContainer interfejsu lub pochodzi od klasy, która implementuje ten interfejs.Kontener logicznie zawiera jeden lub więcej składników, które są wywoływane składniki podrzędne kontenera.Site
Witryna jest klasa, która implementuje System.ComponentModel.ISite interfejsu lub pochodzi od klasy, która implementuje ten interfejs.Witryny są dostarczane przez kontener do zarządzania i komunikować się z jego elementów podrzędnych.Kontener i witryny są implementowane jako jednostka.
Zobacz też
Koncepcje
Atrybuty projektowania składników
Inne zasoby
Programowanie formantów Windows Forms niestandardowy z.NET Framework