Eu sei que os atributos são extremamente úteis. Existem alguns predefinidos, como o [Browsable(false)]
que permite ocultar propriedades na guia de propriedades. Aqui está uma boa pergunta para explicar os atributos: O que são atributos no .NET?
Quais são os atributos predefinidos (e seu espaço para nome) que você realmente usa em seus projetos?
c#
.net
.net-attributes
wusher
fonte
fonte
Respostas:
[DebuggerDisplay]
pode ser realmente útil ver rapidamente a saída personalizada de um Type quando você passa o mouse sobre a instância do Type durante a depuração. exemplo:É assim que deve aparecer no depurador:
Além disso, vale ressaltar que o
[WebMethod]
atributo comCacheDuration
conjunto de propriedades pode evitar a execução desnecessária do método de serviço da web.fonte
System.Obsolete
é um dos atributos mais úteis na estrutura, na minha opinião. A capacidade de emitir um aviso sobre código que não deve mais ser usado é muito útil. Adoro ter uma maneira de dizer aos desenvolvedores que algo não deve mais ser usado, além de explicar o porquê e apontar a melhor / nova maneira de fazer alguma coisa.Também
Conditional attribute
é bastante útil para o uso de depuração. Ele permite que você adicione métodos no seu código para fins de depuração que não serão compilados quando você criar sua solução para lançamento.Existem muitos atributos específicos dos controles da Web que considero úteis, mas esses são mais específicos e não têm nenhum uso fora do desenvolvimento dos controles do servidor, conforme descobri.
fonte
[Flags]
é bastante útil. Açúcar sintático, com certeza, mas ainda assim bastante agradável.Leppie aponta algo que eu não tinha percebido e que diminui meu entusiasmo por esse atributo: ele não instrui o compilador a permitir combinações de bits como valores válidos para variáveis de enumeração, o compilador permite isso de enumerações independentemente. Meu plano de fundo em C ++ mostrando através de ... suspiro
fonte
[Flags]
tem um uso maior do que ser apenas açúcar sintático. Ao usar serviços da Web, a serialização / desserialização não funcionará se um valor comoSandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jam
for passado. Sem o[Flags]
atributo, o desserializador não saberá que o valor pode ser uma combinação de sinalizadores. Aprendi isso da maneira mais difícil depois de passar cerca de dois dias pensando por que meu WCF não estava funcionando.Eu gosto
[DebuggerStepThrough]
de System.Diagnostics .É muito útil para evitar a invasão de métodos ou propriedades de uma linha sem fazer nada (se você for forçado a trabalhar em um .Net inicial sem propriedades automáticas). Coloque o atributo em um método curto ou no getter ou setter de uma propriedade, e você voará direto mesmo quando pressionar "entrar" no depurador.
fonte
Para o que vale, aqui está uma lista de todos os atributos do .NET . Existem várias centenas.
Não conheço mais ninguém, mas tenho um RTFM sério para fazer!
fonte
Meu voto seria para
Conditional
Você pode usar isso para adicionar uma função com recursos avançados de depuração; como
Debug.Write
, é chamado apenas em compilações de depuração e, portanto, permite que você encapsule lógica de depuração complexa fora do fluxo principal do seu programa.fonte
Eu sempre uso os atributos
DisplayName
,Description
eDefaultValue
nas propriedades públicas dos meus controles de usuário, controles personalizados ou qualquer classe que editarei através de uma grade de propriedades. Essas tags são usadas pelo .NET PropertyGrid para formatar o nome, o painel de descrição e os valores em negrito que não estão definidos para os valores padrão.Eu só gostaria que o IntelliSense do Visual Studio levasse o
Description
atributo em consideração se nenhum comentário XML fosse encontrado. Evitaria ter que repetir a mesma frase duas vezes.fonte
Description
até que você .. É o mais útil para mim quando usado com enums ..[Serializable]
é usado o tempo todo para serializar e desserializar objetos de e para fontes de dados externas, como xml ou de um servidor remoto. Mais sobre isso aqui.fonte
No espírito Hofstadt, o
[Attribute]
atributo é muito útil, pois é assim que você cria seus próprios atributos. Eu usei atributos em vez de interfaces para implementar sistemas de plugins, adicionar descrições ao Enums, simular vários despachos e outros truques.fonte
Aqui está o post sobre o interessante atributo InternalsVisibleTo . Basicamente, o que ele faz simula a funcionalidade de acesso a amigos em C ++. É muito útil para testes de unidade.
fonte
internal
não é pública. É público na montagem que está sendo testada e deve ser testado em unidade para que outras classes na montagem possam assumir a funcionalidade de correção. Se você não fizer o teste unitário, precisará testar suas funções em todas as classes de consumo.Eu achei
[DefaultValue]
bastante útil.fonte
Eu sugiro
[TestFixture]
e[Test]
- da biblioteca nUnit .Os testes de unidade no seu código fornecem segurança na refatoração e na documentação codificada.
fonte
pois isso permite que você ignore (em qualquer serialização xml) objetos 'pai' que de outra forma causariam exceções ao salvar.
fonte
Não é bem nomeado, não é bem suportado na estrutura e não deve exigir um parâmetro, mas esse atributo é um marcador útil para classes imutáveis:
fonte
ImmutableObjectAttribute
classe - pelo menos você pode eliminar o parâmetro.Eu gosto de usar o
[ThreadStatic]
atributo em combinação com programação baseada em thread e pilha. Por exemplo, se eu quero um valor que quero compartilhar com o restante de uma sequência de chamadas, mas quero fazê-lo fora da banda (ou seja, fora dos parâmetros de chamada), posso empregar algo assim.Posteriormente no meu código, eu posso usá-lo para fornecer informações contextuais fora da banda para as pessoas a jusante do meu código. Exemplo:
O atributo ThreadStatic permite que eu faça o escopo da chamada apenas para o segmento em questão, evitando o problema confuso do acesso a dados entre segmentos.
fonte
MyContextInformation.Current
para obter o contexto ativo na pilha. Isso é algo que é um conceito muito bom em certos casos, nosso mecanismo (da minha empresa) o usa para vários propósitos.O DebuggerHiddenAttribute que permite evitar a etapa do código que não deve ser depurado.
Também impede a exibição de métodos no rastreamento de pilha, útil ao ter um método que apenas envolve outro método:
Se você chamar agora
GetElementAt(new Vector2(10, 10))
e ocorrer um erro no método agrupado, a pilha de chamadas não mostrará o método que está chamando o método que gera o erro.fonte
DesignerSerializationVisibilityAttribute
é muito útil. Quando você coloca uma propriedade de tempo de execução em um controle ou componente e não deseja que o designer a serialize, use-a assim:fonte
[Browsable(false)]
é necessário para ocultá-lo do usuário do designer, onde[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
é necessário para que não seja serializado.Apenas alguns atributos recebem suporte do compilador, mas um uso muito interessante de atributos está no AOP: o PostSharp usa seus atributos personalizados para injetar IL nos métodos, permitindo que todo tipo de habilidades ... log / trace sejam exemplos triviais - mas outros bons exemplos são coisas como a implementação automática de INotifyPropertyChanged ( aqui ).
Algumas que ocorrem e afetam diretamente o compilador ou o tempo de execução :
[Conditional("FOO")]
- as chamadas para esse método (incluindo avaliação de argumentos) só ocorrem se o símbolo "FOO" for definido durante a compilação[MethodImpl(...)]
- usado para indicar algumas coisas como sincronização, inlining[PrincipalPermission(...)]
- usado para injetar verificações de segurança no código automaticamente[TypeForwardedTo(...)]
- usado para mover tipos entre montagens sem reconstruir os chamadoresPara coisas que são verificadas manualmente via reflexão - eu sou um grande fã dos
System.ComponentModel
atributos; coisas como[TypeDescriptionProvider(...)]
,[TypeConverter(...)]
e[Editor(...)]
que podem alterar completamente o comportamento de tipos em cenários de ligação de dados (ou seja, propriedades dinâmicas, etc).fonte
Se eu fizesse um rastreamento de cobertura de código, acho que esses dois seriam os principais:
fonte
Eu tenho usado o
[DataObjectMethod]
ultimamente. Ele descreve o método para que você possa usar sua classe com o ObjectDataSource (ou outros controles).Mais informações
fonte
Em nosso projeto atual, usamos
Controla a acessibilidade de um tipo ou membro gerenciado individual ou de todos os tipos em um assembly ao COM.
Mais informações
fonte
Diz ao designer para expandir as propriedades que são classes (de seu controle)
Instrui as ferramentas de ofuscação a executar as ações especificadas para uma montagem, tipo ou membro. (Embora normalmente você use um nível de montagem
[assembly:ObfuscateAssemblyAttribute(true)]
fonte
Os atributos que eu mais uso são os relacionados à serialização de XML.
XmlRoot
XmlElement
XmlAttribute
etc ...
Extremamente útil ao realizar qualquer análise ou serialização XML rápida e suja.
fonte
Sendo um desenvolvedor de nível intermediário, eu gosto
System.ComponentModel.EditorBrowsableAttribute
Permite ocultar propriedades para que o desenvolvedor da interface do usuário não fique sobrecarregado com propriedades que eles não precisam ver.System.ComponentModel.BindableAttribute
Algumas coisas não precisam ser vinculadas. Novamente, diminui o trabalho que os desenvolvedores da interface do usuário precisam fazer.Também gosto do
DefaultValue
que Lawrence Johnston mencionou.System.ComponentModel.BrowsableAttribute
eFlags
são usados regularmente.Eu uso
System.STAThreadAttribute System.ThreadStaticAttribute
quando necessário.A propósito. Estes são igualmente valiosos para todos os desenvolvedores de framework .Net.
fonte
[EditorBrowsable(EditorBrowsableState.Never)]
permite ocultar propriedades e métodos do IntelliSense se o projeto não estiver em sua solução. Muito útil para ocultar fluxos inválidos para interfaces fluentes. Com que frequência você deseja GetHashCode () ou Equals ()?Para o MVC,
[ActionName("Name")]
você pode ter uma ação Get e Post action com a mesma assinatura de método, ou usar traços no nome da ação, o que de outra forma não seria possível sem a criação de uma rota para ela.fonte
Considero importante mencionar aqui que os seguintes atributos também são muito importantes:
Indica que o modelo de encadeamento COM para um aplicativo é STA (single-threaded apartment).
Por exemplo, este atributo é usado no Windows Forms Applications:
E também ...
Suprime o relatório de uma violação específica da regra da ferramenta de análise estática, permitindo várias supressões em um único artefato de código.
Por exemplo:
fonte
Em primeiro lugar, aqui está uma lista rápida, mais ou menos classificada por frequência de uso, de atributos predefinidos que eu realmente uso em um grande projeto (~ 500k LoCs):
Sinalizadores, Serializáveis, WebMethod, COMVisible, TypeConverter, Condicional, ThreadStatic, Obsoleto, InternalsVisibleTo, DebuggerStepThrough.
fonte
Gero classe de entidade de dados via CodeSmith e uso atributos para alguma rotina de validação. Aqui está um exemplo:
E eu tenho uma classe de utilitário para fazer a validação com base nos atributos anexados à classe de entidade de dados. Aqui está o código:
fonte
[DeploymentItem("myFile1.txt")]
Doc do MSDN sobre DeploymentItemIsso é realmente útil se você estiver testando em um arquivo ou usando o arquivo como entrada para o seu teste.
fonte
[System.Security.Permissions.PermissionSetAttribute]
permite que ações de segurança para um PermissionSet sejam aplicadas ao código usando segurança declarativa.fonte