C#
-
Atributos mais usados
![]() |
Hoje vou apresentar os atributos mais usados no C#. |
Os atributos em C# fornecem uma maneira de adicionar metadados, comportamento ou configuração a vários elementos do programa. A seguir vou apresentar os atributos mais usados.
Os atributos têm várias finalidades, incluindo:
Os atributos são parte importante do sistema de reflexão do C# e podem ser acessados em tempo de execução para inspecionar informações sobre o código. Você também pode criar seus próprios atributos personalizados para estender o comportamento de seus tipos e membros de classe de acordo com as necessidades do seu projeto.
Para criar atributos personalizados, você deve criar uma classe que herda de System.. Essas classes devem ser marcadas com o sufixo "" por convenção.
Por exemplo:
[Usage(Targets.Class | Targets.Method)]
public class MeuAtributoPersonalizado :
{
// Defina propriedades e lógica personalizada aqui
}
|
A seguir vou apresentar os 25 atributos mais usados na linguagem C# :
[Obsolete]
Marca um elemento do programa como obsoleto ou depreciado, gerando um aviso ou erro quando usado.
[Obsolete("Este método esta depreciado, use MetodoNovo.")]
public void MetodoAntigo() { }
|
[Serializable]
Indica que um objeto pode ser serializado para armazenamento ou transmissão.
[Serializable]
public class SerializableObject { }
|
[DataContract]
e
[DataMember]
[DataContract] public class ClienteWCF { [DataMember(Name = "ID")] // Customiza o nome no contrato public int Id { get; set; } [DataMember(IsRequired = true)] public string Nome { get; set; } } |
Usado no Windows Communication Foundation (WCF) para especificar classes e membros serializáveis.
[DllImport]
class NativeMethods { [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type); } |
Usado para chamar funções de código não gerenciado.
[Conditional]
class DebugLogger { [Conditional("DEBUG")] public static void Log(string message) => Console.WriteLine($"[DEBUG] {message}"); } |
Especifica que um método deve ser chamado condicionalmente com base em símbolos de compilação.
[ThreadStatic]
[Serializable] public class ThreadSafeData { [ThreadStatic] public static int ThreadLocalValue; [NonSerialized] // 12. Não serializa este campo public string TempData; } |
Declara o armazenamento local de thread para um campo, fornecendo a cada thread sua própria cópia.
[Serializable]
[Serializable] public class ThreadSafeData { [ThreadStatic] public static int ThreadLocalValue; [NonSerialized] // 12. Não serializa este campo public string TempData; } |
Marca uma classe como serializável para serialização binária.
[DefaultValue]
public class Configuracao { [DefaultValue(100)] public int Limite { get; set; } = 100; } |
Especifica o valor padrão para uma propriedade ou campo.
[Description]
public
class
Configuracao { [Description("Nome completo do usuário")] public string UserName { get; set; } } |
Fornece uma descrição para uma propriedade, evento ou componente.
[DisplayName]
public
class
Configuracao { [Description("Nome completo do usuário")] [DisplayName("Usuário")] public string UserName { get; set; } } |
Especifica um nome de exibição para uma propriedade ou evento.
[Browsable]
public
class
Configuracao { [Description("Nome completo do usuário")] [DisplayName("Usuário")] [Browsable(false)] // Oculta no designer public string UserName { get; set; } } |
Indica se uma propriedade ou evento deve ser exibido em um designer.
[NonSerialized]
[Serializable] public class ThreadSafeData { [NonSerialized] // 12. Não serializa este campo public string TempData; } |
Impede que um campo seja serializado.
[XmlIgnore]
public class PedidoXML { [XmlIgnore] public Guid InternalId { get; } = Guid.NewGuid(); } |
Exclui uma propriedade da serialização XML.
[XmlElement]
public
class
PedidoXML { [XmlElement("Item")] public string Produto { get; set; } } |
Especifica que uma propriedade deve ser serializada como um elemento XML.
[Authorize]
[Authorize(Roles = "Admin")] [ApiController] public class ProdutosController : ControllerBase { [HttpGet] public IActionResult Get(int id) => Ok(new { Id = id }); } |
Restringe o acesso a um controlador ou método de ação a usuários autorizados.
[Route]
[Authorize(Roles =
"Admin")] // 16. Restrição de acesso [ApiController] public class ProdutosController : ControllerBase { [HttpGet] [Route("api/produtos/{id}")] // 17. Rota customizada public IActionResult Get(int id) => Ok(new { Id = id }); } |
Especifica o modelo de rota para um método de ação no ASP.NET Core.
[Required]
public class UsuarioModel { [Required(ErrorMessage = "Email é obrigatório")] // 18. [EmailAddress] public string Email { get; set; } [MinLength(6)] // 20. [RegularExpression(@"^(?=.*[A-Za-z])(?=.*\d).+$", ErrorMessage = "Senha deve conter letras e números")] // 21. public string Senha { get; set; } } |
Indica que uma propriedade é necessária para validação do modelo.
[MaxLength]
public
class
UsuarioModel { [Required(ErrorMessage = "Email é obrigatório")] [EmailAddress] [MaxLength(100)] public string Email { get; set; } } |
Especifica o comprimento máximo de uma propriedade de cadeia de caracteres.
[MinLength]
public
class
UsuarioModel { [MinLength(6)] public string Senha { get; set; } } |
Especifica o comprimento mínimo para uma propriedade de cadeia de caracteres.
[RegularExpression]
public
class
UsuarioModel { [RegularExpression(@"^(?=.*[A-Za-z])(?=.*\d).+$", ErrorMessage = "Senha deve conter letras e números")] // 21. public string Senha { get; set; } } |
Define um padrão de expressão regular para validação de string.
[Key]
public class Pedido { [Key] // Chave primária public int PedidoId { get; set; } } |
Especifica uma chave primária para uma entidade no Entity Framework.
[ForeignKey]
public
class Pedido { [ForeignKey("Cliente")] //Chave estrangeira public int ClienteId { get; set; } } |
Indica um relacionamento de chave estrangeira no Entity Framework.
[JsonProperty]
public class Produto { [JsonPropertyName("product_id")] //Nome customizado no JSON public int Id { get; set; } } |
Mapeia uma propriedade para um nome de propriedade JSON específico durante a serialização e desserialização.
[JsonIgnore]
public class Produto { [JsonIgnore] //Ignora na serialização public string CodigoInterno { get; set; } } |
Exclui uma propriedade da serialização JSON.
Potencializando seu Código com Atributos
Desta forma, os atributos em C# são ferramentas poderosas que elevam seu código a outro patamar de funcionalidade e organização. Como vimos, eles servem como:
- Facilitadores de
desenvolvimento (com [Obsolete], [Conditional])
- Gerenciadores de dados (com [Serializable],
[DataContract])
-
Controladores de comportamento (com [Authorize], [Route])
- Organizadores de estrutura (com [Key], [ForeignKey])
O verdadeiro poder dos atributos está na capacidade de:
- Documentar seu código de forma
estruturada
- Adicionar
comportamentos sem alterar lógica principal
- Integrar-se perfeitamente com frameworks modernos
Comece aplicando os atributos nativos mais relevantes para seu projeto atual e, quando dominá-los, explore a criação de atributos customizados para soluções específicas.
Lembre-se: um uso bem dosado de atributos pode ser a diferença entre um código funcional e um código profissional, bem estruturado e pronto para escalar.
Que tal escolher 2 ou 3 atributos desta lista e aplicá-los em seu projeto atual ? O ganho em clareza e manutenibilidade pode ser imediato!
E estamos conversados...
"E Jesus, respondendo, disse-lhes: Ide, e anunciai a
João as coisas que ouvis e vedes:
Os cegos veem, e os coxos andam; os
leprosos são limpos, e os surdos ouvem; os mortos são ressuscitados, e aos
pobres é anunciado o evangelho. "
Mateus 11:4,5
Referências:
.NET MAUI - Lançamento da Release Candidate