Passo a passo: Criando um componente com Visual C#
Componentes fornecem código reutilizável na forma de objetos.Um aplicativo que usa o código do componente, criação de objetos e chamando seus métodos e propriedades, é conhecido como um cliente.Um cliente pode ou não estar no mesmo assembly que um componente que ele usa.
Os passos a seguir são incrementais, dependentes, então a ordem de execução é importante.
Observação |
---|
As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritos na Ajuda, dependendo das configurações ativas ou configurações de edição.Para alterar as configurações, escolha Import and Export Settings sobre o Ferramentas menu.Para obter mais informações, consulte Configurações de Visual Studio. |
Criando o projeto
Para criar a biblioteca de classes CDemoLib e o componente de CDemo
Do arquivo menu, selecione New e, em seguida projeto para abrir o Novo projeto caixa de diálogo.Selecione o Biblioteca de classes o modelo de projeto da lista de Visual C# tipos de projeto e, em seguida, digite CDemoLib na nome caixa.
Observação Sempre especifique o nome de um novo projeto ao criá-la.Isso define o namespace raiz, o nome de assembly e o nome do projeto e também garante que o componente padrão será no namespace correto.
Em Solution Explorer, com o botão direito CDemoLib e selecione Propriedades no menu de atalho.Observe que o espaço para nome padrão caixa contém CDemoLib.
O namespace principal é usado para qualificar os nomes dos componentes no conjunto de módulos (assembly).Por exemplo, se dois assemblys fornecem componentes chamados CDemo, você pode especificar o CDemo usando o componente CDemoLib.CDemo.
Feche a caixa de diálogo.
Do projeto menu, escolha Add Component.
No Add New Item caixa de diálogo, selecione Classe de componente e o tipo de CDemo.cs na nome caixa.Clique em Add para criar o componente.
Um componente chamado CDemo é adicionado à sua biblioteca de classe.
Em Solution Explorer, com o botão direito CDemo.cs e escolha Exibir código no menu de atalho.O editor de código é aberto.
Observe o : Component imediatamente após a public partial class CDemo.Esta seção designa a classe da qual sua classe herda.Por padrão, um componente herda a Component classe fornecida pelo sistema.O Component classe fornece muitos recursos para seu componente, incluindo a capacidade de usar designers.
Em Solution Explorer, com o botão direito Class1. cs e escolha Excluir.Isso exclui a classe padrão que é fornecida com a biblioteca de classes, pois ele não será usado nesta explicação.
Do arquivo menu, escolha Salvar tudo para salvar o projeto.
A adição de construtores e destrutores
Construtores de controlam a maneira como o seu componente é inicializado; o Finalize método controla a forma que ele destrói.O código no construtor e o Finalize método da CDemo classe mantém uma execução da contagem do número de CDemo objetos na existência.
Para adicionar código para o construtor e destruidor da classe CDemo
No Editor de código, adicione variáveis de membros para manter um em funcionamento total de instâncias da CDemo classe e um número de identificação para cada instância.
public readonly int InstanceID; private static int NextInstanceID = 0; private static long ClassInstanceCount = 0;
Porque o InstanceCount e NextInstanceID variáveis de membro são declaradas static, eles existem somente no nível de classe.Todas as instâncias de CDemo que acessam tais membros usará os mesmos locais de memória.Membros estáticos serão inicializados pela primeira vez o CDemo classe é chamada no código.Isso poderia ser a primeira vez um CDemo objeto é criado, ou na primeira vez que um dos membros estáticos é acessada.
Localize public CDemo() e public CDemo(IContainer container), os construtores padrão para o CDemo classe.Na Visual C#, todos os construtores têm o mesmo nome da classe.O componente pode ter vários construtores com parâmetros diferentes, mas todos devem ter o mesmo nome de seu componente.
Observação O nível de acesso dos construtores determina quais clientes poderão criar instâncias da classe.
Adicione o seguinte código para public CDemo(), para incrementar a contagem de instância quando uma nova CDemo é criado e para definir o número de identificação de instância.
Observação Sempre adicione seu código após a chamada para InitializeComponent.Nesse ponto, todos os componentes constituintes foram inicializados.
InstanceID = NextInstanceID ++; ClassInstanceCount ++;
Como um readonly membro, InstanceID pode ser definida somente no construtor.
Observação Usuários familiarizados com multithreading serão destaque bastante corretamente essa atribuição de InstanceID e incrementar NextInstanceID deve ser uma operação atômica.Esse e outros problemas relacionados ao threading são ilustrados na Passo a passo: Criando um componente com simples com o visual C#.
Adicione o seguinte método após o término do construtor:
~CDemo() { ClassInstanceCount --; }
Este método é chamado um destruidore é representado pelo caractere de til (~) na frente do nome da classe.O Gerenciador de memória chama o destruidor antes de ele recupera a memória ocupada por finalmente a CDemo objeto.Implementando um destruidor de executar a limpeza antes de seu componente é removido da memória.No entanto, como você verá posteriormente nesta explicação passo a passo, há bons motivos para liberar recursos anteriormente.
A adição de uma propriedade à classe
O CDemo classe possui apenas uma propriedade, uma propriedade estática que permitem ao cliente descobrir como muitos CDemo objetos existem na memória em um determinado momento.Métodos podem ser criados de maneira semelhante.
Para criar uma propriedade para a classe CDemo
Adicione a seguinte declaração de propriedade para o CDemo classe, para permitir que clientes recuperar o número de instâncias de CDemo.
public static long InstanceCount { get { return ClassInstanceCount; } }
O componente de teste.
Para testar o componente, você precisa de um projeto que o utiliza.Este projeto deve ser o primeiro projeto que começa quando você pressiona o botão Run.
Para adicionar o projeto de cliente CDemoTest como o projeto de inicialização para a solução
Do arquivo , aponte para Add e escolha Novo projeto para abrir o Add New Project caixa de diálogo.
Selecione o Windows Application modelo de projeto e o tipo de CDemoTest na nome caixa e, em seguida, clique em OK.
Em Solution Explorer, com o botão direito CDemoTest e clique em Set as Startup Project no menu de atalho.
Para usar o CDemo componente, o projeto de teste do cliente deve ter uma referência ao projeto de biblioteca de classe.Depois de adicionar a referência, é uma boa idéia para adicionar um using instrução para o aplicativo de teste para simplificar o uso do componente.
Para adicionar uma referência ao projeto de biblioteca de classe
Em Solution Explorer, com o botão direito do referências nó imediatamente abaixo CDemoTeste selecione Add Reference no menu de atalho.
No Add Reference caixa de diálogo, selecione o projetos guia.
Clique duas vezes o CDemoLib o projeto de biblioteca de classes.CDemoLib será exibido sob o referências nó para o CDemoTest project.
Em Solution Explorer, com o botão direito Form1. cs e selecione Exibir código no menu de atalho.
Adicionar uma referência CDemoLib permite que você use o nome totalmente qualificado da CDemo componente — ou seja, CDemoLib.CDemo.
Para adicionar um usando instrução
Adicione o seguinte using a instrução à lista de using instruções no topo do O Editor de código para Form1.
using CDemoLib;
Adicionando a using Then permite que você omita o nome da biblioteca e referir-se o tipo de componente, como CDemo.
Agora você criar e usar um programa de teste para testar o seu componente.
Noções básicas sobre o tempo de vida do objeto
O CDemoTest programa irá ilustrar a vida útil do objeto na.NET Framework Criando e liberando o grande número de CDemo objetos.
Para adicionar código para criar e liberar os objetos CDemo
Clique em Form1.cs[Design para retornar para o designer.
Arrastar um Button e um Timer da All Windows Forms guia da caixa de ferramentas até o Form1 superfície de design.
O nonvisual Timer componente aparece em uma superfície de design separados abaixo do formulário.
Clique duas vezes no ícone do timer1 para criar um método de manipulação de eventos para o componente de timer1 Tick evento.Coloque o seguinte código no método de manipulação de eventos.
this.Text = "CDemo instances: " + CDemo.InstanceCount;
Em cada tique do timer, a legenda do formulário exibirá a contagem atual de instância para o CDemo classe.O nome da classe é usado como um qualificador para estática InstanceCount propriedade — não é necessário criar uma instância de CDemo para acessar um membro estático.
Localize o construtor para Form1 (public Form1()) e adicione o seguinte código após a chamada para InitializeComponent().
timer1.Enabled = true;
Isso irá iniciar o cronômetro, assim que o formulário é criado.
Clique no Form1. cs [Design tab para retornar ao designer.
Clique duas vezes o Button na Form1, para criar um método de manipulação de eventos para o botão Click evento.Coloque o seguinte código no método de manipulação de eventos.
CDemo cd; int ct; for (ct = 0; ct < 1000; ct++) cd = new CDemo();
Esse código pode parecer estranho para você.Como cada instância de CDemo é criado, a instância anterior seja liberada.Quando o for loop é feita, haverá somente uma instância de CDemo esquerda.Quando o método de manipulação de eventos é encerrado, até mesmo essa instância será lançada, porque a variável cd sairá do escopo.
Como você pode ter adivinhado já, as coisas não acontecerá muito dessa maneira.
Para executar e depurar projetos CDemoTest e CDemo
Pressione F5 para iniciar a solução.
O projeto de cliente for iniciado, e Form1 será exibido.Observe que a legenda do formulário exibe "instâncias de CDemo: 0".
Clique no botão.A legenda do formulário deve exibir "instâncias de CDemo: 1000".
As instâncias do CDemo foram todos liberados pelo tempo do botão Click o procedimento de tratamento de evento concluído.Por que eles ainda não foi finalizados?Em resumo, o Gerenciador de memória finaliza objetos em segundo plano, com baixa prioridade.A prioridade será aumentada apenas em, se o sistema ficar com pouco memória.Isso preguiçoso esquema de coleta de lixo permite a alocação de objeto muito rápido.
Clique no botão mais várias vezes, observando a legenda.Em algum momento, o número de instâncias repentinamente cairá.Isso significa que o Gerenciador de memória tem reclamado a memória de alguns dos objetos.
Observação Se você clicou em mais de 10 vezes e o número de CDemo instâncias não diminuiu, talvez seja necessário ajustar o código para que ela usa mais memória.Feche o formulário para retornar ao ambiente de desenvolvimento e aumentar o número de iterações, o for loop para 10000.Em seguida, execute novamente o projeto.
Repita a etapa 3.Você obterá futuramente neste momento, antes do Gerenciador de memória finaliza mais objetos.
Na verdade, sempre que você Repita a etapa 3, você provavelmente será capaz de alocar mais CDemo antes de executar etapas no Gerenciador de memória de objetos.Isso ocorre porque mais e mais de Visual Studio é trocada, deixando mais espaço para instâncias de CDemo.
Feche o formulário para retornar ao ambiente de desenvolvimento.