O resharper gosta de apontar várias funções por página asp.net que podem ser tornadas estáticas. Isso me ajuda se eu as tornar estáticas? Devo torná-los estáticos e movê-los para uma classe de utilidade?
O resharper gosta de apontar várias funções por página asp.net que podem ser tornadas estáticas. Isso me ajuda se eu as tornar estáticas? Devo torná-los estáticos e movê-los para uma classe de utilidade?
Respostas:
Métodos estáticos versus métodos de instância
10.2.5 Os membros estáticos e de instância da Especificação da linguagem C # explicam a diferença. Geralmente, os métodos estáticos podem fornecer um aprimoramento de desempenho muito pequeno em relação aos métodos de instância, mas apenas em situações um pouco extremas (consulte esta resposta para obter mais detalhes sobre isso).
A regra CA1822 no FxCop ou na Análise de código afirma:
"Depois de [marcar os membros como estáticos], o compilador emitirá sites de chamada não virtuais para esses membros, o que impedirá uma verificação em tempo de execução de cada chamada, garantindo que o ponteiro do objeto atual seja nulo. Isso pode resultar em um ganho de desempenho mensurável. para código sensível ao desempenho. Em alguns casos, a falha no acesso à instância atual do objeto representa um problema de correção. "
Classe de utilitário
Você não deve movê-los para uma classe de utilitário, a menos que faça sentido em seu design. Se o método estático se relacionar a um tipo específico, como um ToRadians(double degrees)
método a uma classe que representa ângulos, faz sentido que esse método exista como membro estático desse tipo (observe, este é um exemplo complicado para fins de demonstração).
Desempenho, poluição de namespace, etc, são todos secundários em minha opinião. Pergunte a si mesmo o que é lógico. O método está operando logicamente em uma instância do tipo ou está relacionado ao próprio tipo? Se for o último, torne-o um método estático. Somente mova-o para uma classe de utilitário se estiver relacionado a um tipo que não está sob seu controle.
Às vezes, há métodos que logicamente atuam em uma instância, mas não acontecem de usar qualquer um do estado da instância ainda . Por exemplo, se você estivesse construindo um sistema de arquivos e tivesse o conceito de diretório, mas ainda não o tivesse implementado, poderia escrever uma propriedade retornando o tipo de objeto do sistema de arquivos e sempre seria apenas "arquivo" - mas está logicamente relacionado à instância e, portanto, deve ser um método de instância. Isso também é importante se você deseja tornar o método virtual - sua implementação específica pode não precisar de estado, mas classes derivadas podem. (Por exemplo, perguntando a uma coleção se é ou não somente leitura - talvez você ainda não tenha implementado uma forma somente leitura dessa coleção, mas é claramente uma propriedade da própria coleção, não do tipo.)
Marcar um método como static
dentro de uma classe torna óbvio que ele não usa nenhum membro da instância, o que pode ser útil saber ao percorrer o código.
Você não precisa necessariamente movê-lo para outra classe, a menos que seja destinado a ser compartilhado por outra classe que esteja intimamente associada, em termos de conceito.
Tenho certeza de que isso não está acontecendo no seu caso, mas um "mau cheiro" que eu já vi em algum código que tive que sofrer ao manter usado muitos métodos estáticos.
Infelizmente, eram métodos estáticos que assumiram um estado de aplicativo específico. (com certeza, teremos apenas um usuário por aplicativo! Por que a classe User não controla isso em variáveis estáticas?) Elas eram maneiras glorificadas de acessar variáveis globais. Eles também tinham construtores estáticos (!), Que quase sempre são uma má idéia. (Eu sei que existem algumas exceções razoáveis).
No entanto, métodos estáticos são bastante úteis quando fatoram a lógica de domínio que na verdade não depende do estado de uma instância do objeto. Eles podem tornar seu código muito mais legível.
Apenas certifique-se de colocá-los no lugar certo. Os métodos estáticos estão manipulando intrusivamente o estado interno de outros objetos? Pode-se argumentar que o comportamento deles pertence a uma dessas classes? Se você não está separando as preocupações corretamente, pode ter dores de cabeça mais tarde.
Esta é uma leitura interessante:
http://thecuttingledge.com/?p=57
O ReSharper não está sugerindo que você torne seu método estático. Você deve se perguntar por que esse método está nessa classe, em vez de, digamos, uma das classes que aparece em sua assinatura ...
mas aqui está o que a documentação do novo compartilhador diz: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
Apenas para adicionar à resposta de @Jason True , é importante perceber que apenas colocar 'estático' em um método não garante que o método seja 'puro'. Ele será sem estado no que diz respeito à classe em que é declarado, mas pode acessar outros objetos 'estáticos' com estado (configuração do aplicativo etc.); isso nem sempre é uma coisa ruim, mas um dos motivos pelos quais Pessoalmente, tendem a preferir métodos estáticos quando posso: se eles forem puros, você poderá testar e argumentar isoladamente, sem ter que se preocupar com o estado circundante.
Você deve fazer o que for mais legível e intuitivo em um determinado cenário.
O argumento de desempenho não é bom, exceto nas situações mais extremas, pois a única coisa que realmente está acontecendo é que um parâmetro extra ( this
) está sendo empurrado para a pilha por métodos de instância.
Para lógica complexa dentro de uma classe, eu encontrei métodos estáticos privados úteis na criação de lógica isolada, na qual as entradas da instância são claramente definidas na assinatura do método e nenhum efeito colateral da instância pode ocorrer. Todas as saídas devem ser via valor de retorno ou parâmetros de saída / ref. Quebrando a lógica complexa em blocos de código sem efeitos colaterais pode melhorar a legibilidade do código e a confiança da equipe de desenvolvimento nele.
Por outro lado, pode levar a uma classe poluída por uma proliferação de métodos de utilidade. Como de costume, a nomeação lógica, a documentação e a aplicação consistente das convenções de codificação da equipe podem aliviar isso.
Tornar um método estático significa que você pode chamar o método de fora da classe sem antes criar uma instância dessa classe. Isso é útil ao trabalhar com objetos ou complementos de fornecedores de terceiros. Imagine se você tivesse que criar primeiro um objeto do console "con" antes de chamar con.Writeline ();
Ajuda a controlar a poluição do espaço para nome.
Class.a_core_function( .. )
vsa_core_function( .. )
Apenas minha tuppência: a adição de todos os métodos estáticos compartilhados a uma classe de utilitário permite adicionar
using static className;
às instruções using, que tornam o código mais rápido para digitar e mais fácil de ler. Por exemplo, eu tenho um grande número do que seria chamado de "variáveis globais" em algum código que herdei. Em vez de criar variáveis globais em uma classe que era uma classe de instância, eu as defino como propriedades estáticas de uma classe global. Ele faz o trabalho, se estiver confuso, e eu posso apenas referenciar as propriedades pelo nome, porque eu tenho o namespace estático já mencionado.
Não tenho ideia se isso é uma boa prática ou não. Eu tenho muito a aprender sobre C # 4/5 e tanto código legado para refatorar que estou apenas tentando deixar as dicas de Roselyn me guiarem.
Joey
Espero que você já tenha entendido a diferença entre os métodos estático e de instância. Além disso, pode haver uma resposta longa e uma resposta curta. Respostas longas já são fornecidas por outros.
Minha resposta curta: Sim, você pode convertê-los em métodos estáticos, se o Resharper sugerir. Não há mal em fazê-lo. Em vez disso, ao tornar o método estático, você está realmente protegendo o método para que, desnecessariamente, não insira nenhum membro da instância nesse método. Dessa forma, você pode alcançar um princípio de POO " Minimize a acessibilidade de classes e membros ".
Quando o ReSharper sugere que um método de instância pode ser convertido em um método estático, ele está realmente dizendo: "Por que .. esse método está nesta classe, pois na verdade não está usando nenhum de seus estados?" Então, dá-lhe alimento para o pensamento. Então, é você quem pode perceber a necessidade de mover esse método para uma classe de utilidade estática ou não. De acordo com os princípios do SOLID, uma classe deve ter apenas uma responsabilidade central. Assim, você pode fazer uma limpeza melhor de suas aulas dessa maneira. Às vezes, você precisa de alguns métodos auxiliares, mesmo na classe de instância. Se for esse o caso, você pode mantê-los em um #region helper.