Classe contra o componente vs controle

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

ObservaçãoObservação

Este tópico são sobre formulários do windows e classes do ASP.NET.Esta discussão não se aplica a classes WPF para obter informações sobre como criar controles WPF, consulte Visão geral de criação de controle.

A lista a seguir fornece diretrizes amplas para implementadores.

As definições do componente, o do controle, recipiente, e do site seguir.

Componente

Em .NET Framework, um componente é uma classe que implementa a interface de System.ComponentModel.IComponent 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.Um componente de .NET Framework satisfaz os requisitos gerais e além de isso fornece recursos como o controle sobre os recursos externos e suporte em tempo de design.

0b1dk63b.collapse_all(pt-br,VS.110).gifControle sobre os recursos externos

A interface de IComponent estende a interface de IDisposable , que tem um método chamado Dispose no contrato.Em a implementação do método de Dispose , um componente deve liberar recursos externos explicitamente.Isso fornece uma maneira determinística de liberar recursos, em contraste com a limpeza nondeterministic padrão que acontece através de coleta de lixo.Os desenvolvedores devem se propagar Disposeem todo uma hierarquia de retenção para garantir que os filhos de um componente também liberem recursos.Além de isso, um componente derivado deve chamar o método de Dispose de sua classe base.

ObservaçãoObservação

Mesmo quando você fornece o controle explícito sobre recursos com Dispose, você sempre deve fornecer a limpeza implícita entre finalizadora (destrutor) para impedir que os recursos escapem permanentemente se um usuário não chama Dispose no seu componente.

O exemplo a seguir mostra o padrão para implementar Dispose em um componente base e um componente derivado.

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

0b1dk63b.collapse_all(pt-br,VS.110).gifSuporte em tempo de design

Um recurso importante de componentes em .NET Framework é que são projetáveis, o que significa que uma classe que é um componente pode ser usada em um ambiente de (RAD) de desenvolvimento de aplicativos de rapid como Visual Studio.Um componente pode ser adicionado à caixa de ferramentas de Visual Studio, pode ser arrastado e solto em um formulário, e pode ser manipulado em uma superfície de design.Observe que o suporte básico em tempo de design para tipos de IComponent é compilado em .NET Framework; um desenvolvedor de componente não tem que fazer qualquer trabalho adicional para aproveitar a base em 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.

0b1dk63b.collapse_all(pt-br,VS.110).gifHospedando um componente

Um componente pode ser localizado (hospedado) em um contêiner (definido mais adiante em este tópico).Quando um componente é localizado, interage com o recipiente através do site (definido posteriormente em este tópico) e tem a capacidade de consulta e obter serviços de seu recipiente através do site.Para garantir que os recursos são liberados quando um recipiente é rasgado para baixo, um contêiner deve implementar a interface de IDisposable .Em a implementação do método de Dispose , um contêiner deve liberar quaisquer recursos que comporta e chama o método de Dispose de cada um dos seus componentes contidos.

A retenção é lógica e não precisa ter uma representação visual.Um recipiente de camada intermediária que localize componentes de banco de dados é um exemplo de retenção não visuais.A retenção visual é considerada no windows forms designer e o Web Forms designer em Visual Studio.A superfície de design visual é um contêiner que hospeda o componente de formulário (na Web, componente da página).

0b1dk63b.collapse_all(pt-br,VS.110).gifEmpacotamento um componente

Componentes podem ser remotos ou nonremotable.Componentes de Remotos são empacotados por valor ou por referência.Empacotamento envolve enviar objetos através de limites como Domínios de aplicativo (processos leve), processos, e mesmo computadores.Quando um objeto é empacotada por referência, um proxy é criado que faz chamadas remotas ao objeto.Quando um objeto é empacotada por valor, uma cópia serializada do objeto é enviada pelo limite relevante.

Componentes de Remotos que encapsulam os recursos do sistema, que são maiores, ou que existem como as únicas instâncias devem ser empacotado por referência.A classe base para componentes que é empacotada por referência é System.ComponentModel.Component.Essa classe base para implementar IComponent e deriva de MarshalByRefObject.Muitos componentes na biblioteca de classes de .NET Framework derivam de Component, incluindo System.Windows.Forms.Control (a classe base para controles de formulários do windows), System.Web.Services.WebService (a classe base para os serviços Web XML criados usando ASP.NET), e System.Timers.Timer (uma classe que gera eventos de retorno).

Componentes de Remotos que apenas o estado de propriedade deve ser empacotado por valor.A classe base para componentes que são empacotados pelo valor é System.ComponentModel.MarshalByValueComponent.Essa classe base para implementar IComponent e deriva de Object.Apenas alguns componentes na biblioteca de classes de .NET Framework derivam de MarshalByValueComponent.Todos esses componentes estão no namespace de System.Data (DataColumn, DataSet, DataTable, DataView, e DataViewManager).

ObservaçãoObservação

As classes base para os objetos que são empacotados por valor e por referência ObjectMarshalByRefObjectsão e, respectivamente, mas as classes derivadas correspondentes são chamadas MarshalByValueComponent e Component.A lógica arquivo de esquema de nomeação é que o tipo mais comumente tem o nome mais simples.

Se um componente não será remoted, não derivam das implementações básicas para Component; em vez de isso, implemente IComponent diretamente.

Controle

Um controle é um componente que fornece (ou) permite recursos de (UI) da interface do usuário..NET Framework fornece duas classes base para controles: um para controles de formulários do lado do cliente windows e outro para controles de servidor de ASP.NET .Esses são System.Windows.Forms.Control e System.Web.UI.Control.Todos os controles na biblioteca de classes de .NET Framework derivam direta ou indiretamente de essas duas classes.System.Windows.Forms.Control deriva de Component e próprio fornece recursos de interface do usuário.System.Web.UI.Control implementa 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 oposto não é válido.

Contêiner e site

Se você estiver desenvolvendo componentes e controles para formulários do windows ou para páginas de Web Forms (páginas deASP.NET ), você não tem que implementar recipiente ou sites.Os designers para windows forms e formulários da Web são contëineres para formulários do windows e para controles de servidor de ASP.NET .Contêiners fornecem serviços para componentes e controles localizados dentro de eles.Em tempo de design, os controles são localizados no designer e obtêm serviços de designer.Para a abrangência, definições de um contêiner e um site são fornecidas abaixo.

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

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

Consulte também

Conceitos

Visão geral das propriedades

Atributos de tempo de design para componentes

Outros recursos

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

Developing Custom ASP.NET Server Controls

Estendendo suporte em tempo de Design