Pergunta

Eu li sobre métodos parciais nas últimas Especificação da linguagem C#, então entendo os princípios, mas estou me perguntando como as pessoas os estão realmente usando.Existe um padrão de design específico que se beneficia dos métodos parciais?

Foi útil?

Solução

Métodos parciais foram introduzidos por razões semelhantes às das classes parciais no .Net 2.

Uma classe parcial é aquela que pode ser dividida em vários arquivos - o compilador constrói todos eles em um arquivo enquanto é executado.

A vantagem disso é que o Visual Studio pode fornecer um designer gráfico para parte da classe enquanto os codificadores trabalham na outra.

O exemplo mais comum é o designer de formulários.Os desenvolvedores não querem posicionar botões, caixas de entrada, etc. manualmente na maior parte do tempo.

  • No .Net 1, era um código gerado automaticamente em um #region bloquear
  • No .Net 2, elas se tornaram classes de designer separadas - o formulário ainda é uma classe, apenas dividido em um arquivo editado pelos desenvolvedores e outro pelo designer do formulário

Isso torna a manutenção de ambos muito mais fácil.As mesclagens são mais simples e há menos risco de o designer de formulários do VS desfazer acidentalmente as alterações manuais dos codificadores.

No .Net 3.5 o Linq foi introduzido.Linq possui um designer DBML para construir suas estruturas de dados e que gera código automático.

A vantagem aqui é o código necessário para fornecer métodos que os desenvolvedores possam querer preencher.

Como os desenvolvedores estenderão essas classes (com arquivos parciais extras), eles não poderão usar métodos abstratos aqui.

A outra questão é que na maioria das vezes esses métodos não serão chamados, e chamar métodos vazios é uma perda de tempo.

Métodos vazios não estão otimizados.

Portanto, o Linq gera métodos parciais vazios.Se você não criar seu próprio parcial para completá-los, o compilador C# irá apenas otimizá-los.

Para que isso possa ser feito, os métodos parciais sempre retornam nulos.

Se você criar um novo arquivo Linq DBML, ele gerará automaticamente uma classe parcial, algo como

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

Então, em seu próprio arquivo parcial, você pode estender isso:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

Se você não estender esses métodos, eles serão otimizados imediatamente.

Métodos parciais não podem ser públicos - pois eles teriam que estar lá para serem chamados por outras classes.Se você escrever seus próprios geradores de código, posso considerá-los úteis, mas, caso contrário, eles só serão realmente úteis para o designer do VS.

O exemplo que mencionei antes é uma possibilidade:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

Outro uso potencial é se você tiver uma classe grande e complexa espalhada por vários arquivos, talvez queira referências parciais no arquivo de chamada.No entanto, acho que nesse caso você deveria considerar simplificar a classe primeiro.

Outras dicas

Os métodos parciais são muito semelhantes em conceito ao GoF Método de modelo padrão comportamental (Padrões de design, p325).

Eles permitem que o comportamento de um algoritmo ou operação seja definido em um local e implementado ou alterado em outro local, permitindo extensibilidade e personalização.Comecei a usar métodos parciais em C# 3.0 em vez de métodos de modelo porque acho que o código é mais limpo.

Um recurso interessante é que os métodos parciais não implementados não geram sobrecarga de tempo de execução à medida que são compilados.

Geração de código é uma das principais razões pelas quais existem e uma das principais razões para usá-los.


EDITAR:Embora esse link seja para informações específicas do Visual Basic, os mesmos princípios básicos são relevantes para o C#.

Eu os vejo como eventos leves.Você pode ter um arquivo de código reutilizável (geralmente gerado automaticamente, mas não necessariamente) e para cada implementação, apenas manipule os eventos de seu interesse em sua classe parcial.Na verdade, é assim que ele é usado no LINQ to SQL (e por que o recurso da linguagem foi inventado).

Aqui está o melhor recurso para classes parciais em C#.NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

Tento evitar o uso de classes parciais (com exceção das parciais criadas pelo Visual Studio para arquivos de designer;esses são ótimos).Para mim, é mais importante ter todo o código de uma classe em um só lugar.Se sua classe for bem projetada e representar uma coisa (princípio de responsabilidade única), então todo o código dessa coisa deverá estar em um só lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top