Partilhar via


Classe vs. Componente vs. Controle

Este tópico define componente e controle; a discussão apresentada aqui deve ajudá-lo a decidir quando implementar uma classe que é um componente ou controle.

ObservaçãoObservação

Este tópico é sobre Windows Forms e ASP.Classes de rede. Essa discussão não se aplica a classes do WPF para obter informações sobre autoria de controles do WPF, consulte Visão geral sobre criação de controles.

A lista a seguir fornece diretrizes amplas para implementadores.

Execute as definições de componente, o controle, o contêiner e o site.

Componente

No .NET Framework, um componente é uma classe que implementa o System.ComponentModel.IComponent interface ou que deriva direta ou indiretamente de uma classe que implementa IComponent. Em programação, o termo component é geralmente usado para um objeto que é reutilizável e pode interagir com outros objetos. A .NET Framework satisfaz os requisitos gerais de componente e Além disso, fornece recursos como controle sobre recursos externos e suporte de tempo de design.

Controle sobre recursos externos

O IComponent interface estende a IDisposable interface, que tem um método chamado Dispose no contrato. Em sua implementação da Dispose método, um componente deve liberar recursos externos explicitamente. Isso fornece uma maneira determinista para liberar recursos e, em contraste com a limpeza não determinísticas padrão que ocorre por meio da coleta de lixo. Os desenvolvedores devem propagar Disposeao longo de uma hierarquia de contenção para garantir que os filhos de um componente também liberar recursos. Além disso, um componente derivado deve chamar o Dispose o método de sua classe de base.

ObservaçãoObservação

Mesmo quando você fornecer controle explícito sobre recursos por meio de Dispose, você deve sempre fornecer limpeza implícita, por meio do finalizador (destruidor) para impedir que os recursos de permanentemente vazar se um usuário falhar chamar Dispose no componente.

O exemplo a seguir mostra o padrão para a implementação de Dispose em um componente de base e em um componente derivada.

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

Suporte em tempo de design

Um recurso importante de componentes do .NET Framework é que eles são projetáveis, o que significa que uma classe que é um componente pode ser usada em um ambiente de desenvolvimento (RAD) rápido de aplicativos, como Visual Studio. Um componente pode ser adicionado à caixa de ferramentas de Visual Studio, pode ser arrastado e solto sobre um formulário e pode ser manipulado em uma superfície de design. Observe que suporte base de tempo de design para IComponent tipos é incorporado a .NET Framework; um desenvolvedor de componentes não tem qualquer trabalho adicional para aproveitar a funcionalidade básica de tempo de design.

Para obter mais informações sobre suporte em tempo de design, consulte Atributos de tempo de design para componentes e Estendendo suporte em tempo de design.

Um componente de hospedagem.

Um componente pode ser localizado (hospedada) em um recipiente (definido mais adiante neste tópico). Quando um componente é localizado, ele interage com o recipiente através de seu site (definida mais adiante neste tópico) e tem a capacidade de consultar e obter serviços de seu recipiente através do site. Para garantir que os recursos são liberados quando um recipiente é subdividido, um contêiner deve implementar a IDisposable interface. Em sua implementação da Dispose método, um recipiente deve liberar todos os recursos que ele contém e chamar o Dispose o método de cada um dos seus componentes contidos.

Confinamento é lógico e não precisa ter uma representação visual. Um recipiente de camada intermediária que componentes de banco de dados de sites é um exemplo de confinamento não visuais. Detenção Visual é vista no designer do Windows Forms e Web Forms designer no Visual Studio. A superfície de design visual é um recipiente que hospeda o componente de formulário (formulários da Web, o componente de página).

Um componente de empacotamento.

Componentes podem ser remoto ou nonremotable. Componentes de remota são empacotados por referência ou por valor. Empacotamento envolve enviar objetos através de limites, como Domínios de Aplicativo (processos leves), processos e até mesmo máquinas. Quando um objeto é empacotado por referência, um proxy que faz chamadas remotas para o objeto é criado. Quando um objeto é empacotado por valor, uma cópia serializada do objeto é enviada através do limite relevante.

Remoto componentes que encapsulam os recursos do sistema, que são grandes ou que existe como instâncias isoladas devem ser empacotadas por referência. A classe base para componentes que são empacotados de referência é System.ComponentModel.Component. Essa classe base implementa IComponent e deriva de MarshalByRefObject. Muitos componentes na .NET Framework biblioteca de classes derivar de Component, incluindo System.Windows.Forms.Control (a classe base para controles Windows Forms), System.Web.Services.WebService (a classe base para XML Web services criados usando ASP.NET), e System.Timers.Timer (uma classe que gera eventos recorrentes).

Componentes de remota, basta mantém o estado devem ser empacotados por valor. A classe base para componentes que são empacotados de valor é System.ComponentModel.MarshalByValueComponent. Essa classe base implementa IComponent e deriva de Object. Somente alguns componentes do .NET Framework derivam de biblioteca de classe MarshalByValueComponent. Todos esses componentes estão na System.Data namespace (DataColumn, DataSet, DataTable, DataView, e DataViewManager).

ObservaçãoObservação

A base de classes para objetos que são empacotados pelo valor e por referência são Object e MarshalByRefObject, respectivamente, mas as classes derivadas correspondentes são nomeadas MarshalByValueComponent e Component. A lógica por trás do esquema de nomeação é que o tipo mais comumente usado tem o nome mais simples.

Se um componente não será remoto, não derivar as implementações básicas para Component; em vez disso, implementar IComponent diretamente.

Controle

Um controle é um componente que fornece (ou ativa) os recursos de interface de usuário (UI). O .NET Framework fornece duas classes base para controles: um para controles de Windows Forms do lado do cliente e outro para ASP.NET controles de servidor. Esses são System.Windows.Forms.Control e System.Web.UI.Control. Todos os controles de .NET Framework biblioteca de classes derivam direta ou indiretamente essas duas classes. System.Windows.Forms.Controlderiva de Component e o próprio fornece recursos de interface do usuário. System.Web.UI.Controlimplementa IComponent e fornece a infra-estrutura em que é fácil adicionar funcionalidade de interface do usuário.

ObservaçãoObservação

Cada controle é um componente, mas o inverso não é verdade.

Contêiner e Site

Se você estiver desenvolvendo componentes e controles de Windows Forms ou de páginas de Web Forms (ASP.NET páginas), não é necessário implementar contêineres ou sites. Os designers para o Windows Forms e Web Forms são recipientes para o Windows Forms e ASP.NET controles de servidor. Contêineres fornecem serviços para os componentes e controles situados dentro deles. Em tempo de design, os controles estão situados no designer e obter serviços do designer. Para completude, as definições de um recipiente e um site são fornecidas abaixo.

  • Container
    Um recipiente é uma classe que implementa o System.ComponentModel.IContainer interface ou deriva de uma classe que implementa essa interface. Logicamente, um recipiente contém um ou mais componentes que são chamados de componentes de filhos do contêiner.

  • Site
    Um site é uma classe que implementa o System.ComponentModel.ISite interface ou deriva de uma classe que implementa essa interface. Sites são fornecidos por um contêiner para gerenciar e comunicar-se com seus componentes filhos. Normalmente, um recipiente e um site são implementados como uma unidade.

Consulte também

Conceitos

Visão geral sobre propriedades

Atributos de tempo de design para componentes

Outros recursos

Desenvolvendo controles de formulários do Windows personalizada com o.NET Framework

Desenvolvendo Controles Personalizados ASP.NET Server

Estendendo suporte em tempo de design

Histórico de alterações

Date

History

Motivo

Julho de 2010

Adicionada uma nota que este tópico é apenas Windows Forms.

Comentários do cliente.