<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cassio Jhones</title>
    <description>The latest articles on DEV Community by Cassio Jhones (@cassiojhones).</description>
    <link>https://dev.to/cassiojhones</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2247840%2F6c43b85e-40e1-41b3-aef9-3b28fdf5742a.png</url>
      <title>DEV Community: Cassio Jhones</title>
      <link>https://dev.to/cassiojhones</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cassiojhones"/>
    <language>en</language>
    <item>
      <title>O poder oculto do sealed no C#</title>
      <dc:creator>Cassio Jhones</dc:creator>
      <pubDate>Sun, 26 Apr 2026 20:58:29 +0000</pubDate>
      <link>https://dev.to/cassiojhones/o-poder-oculto-do-sealed-no-c-5gf8</link>
      <guid>https://dev.to/cassiojhones/o-poder-oculto-do-sealed-no-c-5gf8</guid>
      <description>&lt;p&gt;O modificador &lt;code&gt;sealed&lt;/code&gt; é o centro de muitas discussões, benchmarks e artigos na comunidade .NET. Embora seja um recurso antigo da linguagem, ele ganhou destaque nas versões recentes do .NET devido às otimizações agressivas do compilador JIT (Just-In-Time).&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o modificador &lt;code&gt;sealed&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Em termos simples, o &lt;code&gt;sealed&lt;/code&gt; serve para frear a expansão da herança. Ao marcar uma classe ou membro como selado, estamos dizendo ao compilador que aquela estrutura não deve ser herdada ou estendida. O uso mais comum é no nivel de classe, impedindo que qualquer outra classe herde dela, mas pode ser aplicado em métodos ou propriedades que foram sobrescritos (&lt;code&gt;override&lt;/code&gt;).&lt;br&gt;
Isso permite que uma classe herde de uma base, mas impeça que suas próprias subclasses continuem alterando aquele comportamento específico.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;No nível da Classe&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro9ce5p2fovmli9ieruy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fro9ce5p2fovmli9ieruy.png" alt="classLevel" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;No nível de Membro&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo7qdt0zqma2o7cij0g9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo7qdt0zqma2o7cij0g9.png" alt="memberlevel" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Os dois pilares do por que utilizar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Design Defensivo e Intenção Clara
&lt;/h3&gt;

&lt;p&gt;Do ponto de vista arquitetural, se uma classe não foi projetada para ser herdada, deixá-la aberta é um risco. O &lt;code&gt;sealed&lt;/code&gt; garante que a classe será usada exatamente como você a projetou, protegendo invariantes importantes do seu domínio. É o princípio da "Imutabilidade da Hierarquia".&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Otimização de Performance (A Mágica do JIT)
&lt;/h3&gt;

&lt;p&gt;É justamente aqui que o modificador &lt;code&gt;sealed&lt;/code&gt; mostra sua verdadeira força no .NET moderno, permitindo que o compilador JIT aplique uma série de otimizações agressivas que transformam a execução do seu código. O primeiro grande impacto ocorre através da devirtualização: enquanto uma chamada de método virtual padrão exige que o runtime consulte a &lt;em&gt;Virtual Method Table&lt;/em&gt; (vtable) para decidir qual implementação invocar, o uso do &lt;code&gt;sealed&lt;/code&gt; dá ao JIT a confiirmação para ignorar essa etapa e realizar uma chamada direta. Essa simplificação gera um efeito cascata positivo, facilitando o &lt;em&gt;inlining&lt;/em&gt; de métodos (o corpo da função é injetado no local da chamada) o que reduz o overhead de empilhamento de funções e melhora drasticamente a eficiência do cache da CPU. Além disso, até operações cotidianas de checagem de tipos, como o uso dos operadores &lt;code&gt;is&lt;/code&gt; e &lt;code&gt;as&lt;/code&gt;, tornam-se mais rapidas, já que o runtime deixa de navegar por toda a árvore de herança para validar a compatibilidade do objeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando NÃO usar?
&lt;/h2&gt;

&lt;p&gt;Embora os benefícios de performance e segurança sejam nítidos, o modificador &lt;code&gt;sealed&lt;/code&gt; não deve ser encarado como uma solução universal, existindo cenários específicos onde a flexibilidade da herança é mandatória para o funcionamento de certas ferramentas. Um exemplo clássico ocorre ao lidar com o Entity Framework, que depende da capacidade de criar classes derivadas em tempo de execução para gerenciar o carregamento preguiçoso (&lt;em&gt;lazy loading&lt;/em&gt;). Se uma entidade for selada, o framework não conseguirá estendê-la para interceptar o acesso às propriedades de navegação, como demonstrado abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9uioo3rs1oagb7jizl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9uioo3rs1oagb7jizl8.png" alt="EF-Use" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro obstáculo comum surge na camada de testes de unidade ao utilizar bibliotecas de simulação como Moq ou NSubstitute. Essas ferramentas operam criando subclasses dinâmicas para substituir o comportamento de dependências reais e, por isso, ao tentar criar um mock de uma classe selada, o desenvolvedor se deparará com uma exceção de execução, já que o framework de teste será impedido de herdar do tipo protegido. Um caso prático seria a tentativa de simular um serviço de integração:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dn11adfg4dpqsnknz2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8dn11adfg4dpqsnknz2i.png" alt="MoqUse" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hora de ver na prática!
&lt;/h2&gt;

&lt;p&gt;Vamos olhar o código de máquina gerado para duas chamadas idênticas, uma em uma classe aberta e outra selada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0j5cszcmcrzqld3lb05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0j5cszcmcrzqld3lb05.png" alt="Bench" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O custo da classe aberta (&lt;code&gt;TestarAberto&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Aqui é onde vemos o peso do "Virtual Dispatch" (a busca pelo método correto em tempo de execução). Mesmo o método estando vazio, o JIT não pode confiar que a classe que chegou ali é a &lt;code&gt;ClasseAberta&lt;/code&gt; original. Ela poderia ser uma classe filha que sobrescreveu o método. Por isso, ele gera essa burocracia:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finzmbums76ewtwng4toe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finzmbums76ewtwng4toe.png" alt="open" width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A mágica da classe selada (&lt;code&gt;TestarSelado&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Comparando os códigos de máquina gerados, fica fácil ver a diferença na prática. Na classe aberta, o processador é obrigado a realizar múltiplas leituras em memória para localizar a Virtual Method Table antes de conseguir executar a chamada (call).&lt;/p&gt;

&lt;p&gt;Já na classe sealed, o compilador teve absoluta certeza de qual método seria executado. Isso permitiu que ele aplicasse a devirtualização e, em seguida, o inlining. Toda a burocracia de ponteiros desapareceu, sobrando apenas uma validação de nulidade (null check) antes de retornar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj6yhexq3y21k0azwzkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdj6yhexq3y21k0azwzkz.png" alt="close" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: A Regra do "Sealed por Padrão"
&lt;/h2&gt;

&lt;p&gt;Muitos arquitetos hoje recomendam a adoção da mentalidade &lt;strong&gt;Selado por Padrão&lt;/strong&gt;. A premissa é simples: feche todas as suas classes. Se, no futuro, houver uma necessidade real de aplicar herança, você remove a restrição.&lt;/p&gt;

&lt;p&gt;Ao adotar esse hábito, você protege o design do seu código contra extensões não planejadas e ainda ganha performance "de graça".&lt;br&gt;
Pergunte-se: "Alguém realmente precisa herdar disso?". Se a resposta for não, melhor selar.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Referências Usadas e Leitura Recomendada
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Medium (Jiyan Epözdemir):&lt;/strong&gt; &lt;a href="https://medium.com/c-sharp-programming/sealed-classes-in-c-b9cb0ba8f9ad" rel="noopener noreferrer"&gt;Sealed Classes in C#&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium (Özkan ARDİL):&lt;/strong&gt; &lt;a href="https://medium.com/@ozkanardil/what-is-the-purpose-of-the-sealed-modifier-in-c-bd74c4fc38fc" rel="noopener noreferrer"&gt;What is the purpose of the “sealed” modifier in C#?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium (Kelvin Ferreira):&lt;/strong&gt; &lt;a href="https://k30v1n.medium.com/heran%C3%A7a-polimorfismo-e-encapsulamento-c-te-ajudando-a-colocar-a-teoria-na-pr%C3%A1tica-com-3d5d7be226d" rel="noopener noreferrer"&gt;Herança, Polimorfismo e Encapsulamento&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Learn:&lt;/strong&gt; &lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/programming-guide/classes-and-structs/abstract-and-sealed-classes-and-class-members" rel="noopener noreferrer"&gt;Classes abstratas e lacradas e membros de classe&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Learn:&lt;/strong&gt; &lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/keywords/sealed" rel="noopener noreferrer"&gt;Modificador sealed c#&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geek for Geeks:&lt;/strong&gt; &lt;a href="https://www.geeksforgeeks.org/c-sharp/sealed-class-in-c-sharp/" rel="noopener noreferrer"&gt;Sealed Class in C#&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>performance</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
