{"id":951,"date":"2025-01-10T11:04:16","date_gmt":"2025-01-10T14:04:16","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=951"},"modified":"2025-01-10T11:04:16","modified_gmt":"2025-01-10T14:04:16","slug":"nil-e-null-vixi-e-agora","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/nil-e-null-vixi-e-agora\/","title":{"rendered":"Nil e Null. Vixi! E agora?"},"content":{"rendered":"\n<p>Em Delphi, lidar com refer\u00eancias a objetos \u00e9 uma tarefa que parece simples \u00e0 primeira vista, mas pode esconder armadilhas perigosas. Se voc\u00ea j\u00e1 se deparou com mensagens de erro ao acessar um objeto &#8220;nulo&#8221;, sabe o impacto que isso pode causar. E agora, como resolver? \u00c9 uma boa ideia usar <code>nil<\/code> ou <code>null<\/code> para inicializar ou verificar vari\u00e1veis? Ser\u00e1 que existe um jeito mais seguro e elegante de lidar com isso?<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Neste artigo, vamos explorar as diferen\u00e7as entre <code>nil<\/code> e <code>null<\/code>, seus usos (ou falta deles), e como podemos aplicar boas pr\u00e1ticas para evitar problemas futuros. A ideia aqui \u00e9 deixar o c\u00f3digo mais leg\u00edvel, seguro e f\u00e1cil de manter. Ent\u00e3o, vamos colocar a m\u00e3o na massa e resolver essa d\u00favida de uma vez por todas!<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>O Problema com <code>nil<\/code> e <code>null<\/code><\/strong><\/h4>\n\n\n\n<p>Para quem programa em Delphi, \u00e9 comum usar <code>nil<\/code> para inicializar ou verificar se um objeto est\u00e1 &#8220;vazio&#8221;. No entanto, essa pr\u00e1tica pode gerar confus\u00f5es e problemas em c\u00f3digos mais complexos. Afinal, <code>nil<\/code> \u00e9 apenas uma representa\u00e7\u00e3o de aus\u00eancia de refer\u00eancia, mas n\u00e3o indica contexto. Por outro lado, <code>null<\/code> \u00e9 amplamente usado em bancos de dados para sinalizar a aus\u00eancia de um valor, sendo um conceito diferente do <code>nil<\/code> no Delphi.<\/p>\n\n\n\n<p>O grande problema surge quando utilizamos essas abordagens de forma indiscriminada, resultando em c\u00f3digos dif\u00edceis de manter e propensos a erros. Como podemos melhorar isso?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>O que \u00e9 <code>nil<\/code>? Para que serve? Como funciona?<\/strong><\/h3>\n\n\n\n<p>No Delphi, <code>nil<\/code> \u00e9 uma constante especial usada para representar a aus\u00eancia de refer\u00eancia em um ponteiro ou objeto. Ele \u00e9 equivalente a dizer que algo est\u00e1 &#8220;vazio&#8221; ou &#8220;n\u00e3o inicializado&#8221;. Por exemplo, ao criar um objeto, voc\u00ea pode defini-lo como <code>nil<\/code> at\u00e9 que ele seja instanciado.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Uso do <code>nil<\/code>:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Indicar que um objeto ainda n\u00e3o foi criado.<\/li>\n\n\n\n<li>Especificar que uma refer\u00eancia a ponteiro ou objeto foi liberada.<\/li>\n\n\n\n<li>Verificar se um objeto ou ponteiro j\u00e1 foi instanciado ou ainda est\u00e1 &#8220;nulo&#8221;.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Como funciona:<\/strong><\/h4>\n\n\n\n<p>O valor <code>nil<\/code> \u00e9 internamente representado pelo endere\u00e7o de mem\u00f3ria <code>0<\/code>. No momento em que voc\u00ea usa <code>nil<\/code> para um objeto, voc\u00ea est\u00e1 basicamente dizendo ao compilador que ele n\u00e3o deve apontar para nenhuma posi\u00e7\u00e3o v\u00e1lida na mem\u00f3ria.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >var\n  Cliente: TObject;\nbegin\n  Cliente := nil; \/\/ O objeto ainda n\u00e3o foi inicializado\n  if not Assigned(Cliente) then\n    WriteLn('Objeto n\u00e3o inicializado.');\nend;\n<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Cuidados com <code>nil<\/code>:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usar objetos sem verificar se est\u00e3o atribu\u00eddos (<code>Assigned<\/code>) pode causar erros como <code>Access Violation<\/code>.<\/li>\n\n\n\n<li>Liberar a mem\u00f3ria de objetos com <code>Free<\/code> sem definir <code>nil<\/code> posteriormente pode gerar refer\u00eancias pendentes perigosas.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>O que \u00e9 <code>null<\/code>? Para que serve? Como funciona?<\/strong><\/h3>\n\n\n\n<p>O termo <code>null<\/code> n\u00e3o \u00e9 diretamente utilizado no Delphi como parte da linguagem, mas est\u00e1 intimamente relacionado a bancos de dados e sistemas externos. No contexto do Delphi, <code>null<\/code> \u00e9 um valor usado para indicar a aus\u00eancia de um dado ou valor desconhecido em opera\u00e7\u00f5es com bases de dados.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Uso do <code>null<\/code>:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Representar a aus\u00eancia de valor em campos de tabelas de banco de dados.<\/li>\n\n\n\n<li>Trabalhar com frameworks como FireDAC, onde o valor <code>null<\/code> \u00e9 atribu\u00eddo a par\u00e2metros ou campos vazios.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Como funciona:<\/strong><\/h4>\n\n\n\n<p>No contexto de bancos de dados, <code>null<\/code> \u00e9 um conceito que indica &#8220;n\u00e3o h\u00e1 dado aqui&#8221;. Ele n\u00e3o \u00e9 o mesmo que um valor vazio ou zero, mas sim uma aus\u00eancia completa de informa\u00e7\u00e3o. Em Delphi, o uso de <code>null<\/code> \u00e9 geralmente manipulado por bibliotecas de acesso a dados como FireDAC.<\/p>\n\n\n\n<p><strong>Exemplo de uso com FireDAC:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >var\n  FDQuery: TFDQuery;\nbegin\n  FDQuery.ParamByName('Nome').Value := Null; \/\/ Indica que o campo \"Nome\" est\u00e1 vazio\n  FDQuery.ExecSQL;\nend;\n<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Cuidados com <code>null<\/code>:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Compara\u00e7\u00f5es diretas com <code>null<\/code> n\u00e3o funcionam. \u00c9 necess\u00e1rio usar fun\u00e7\u00f5es espec\u00edficas, como <code>IsNull<\/code>.<\/li>\n\n\n\n<li>Tratar valores <code>null<\/code> em consultas pode evitar erros, mas precisa de l\u00f3gica espec\u00edfica para interpretar a aus\u00eancia de dados.<\/li>\n<\/ul>\n\n\n\n<p>Apesar disso, o Null tamb\u00e9m pode ser encontrado na linguagem. Veja:<\/p>\n\n\n\n<p>No Delphi, <code>Null<\/code> \u00e9 uma constante do tipo variante que representa um valor indefinido ou desconhecido. \u00c9 frequentemente utilizada em opera\u00e7\u00f5es que envolvem variantes, especialmente ao interagir com bancos de dados ou automa\u00e7\u00e3o OLE, onde campos podem n\u00e3o ter valores atribu\u00eddos.<\/p>\n\n\n\n<p><strong>Uso do <code>Null<\/code>:<\/strong><\/p>\n\n\n\n<p><strong>Atribui\u00e7\u00e3o a Variantes:<\/strong> Pode-se atribuir <code>Null<\/code> a uma vari\u00e1vel do tipo <code>Variant<\/code> para indicar a aus\u00eancia de valor.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >var\n  V: Variant;\nbegin\n  V := Null; \/\/ V agora representa um valor indefinido\nend;\n<\/pre><\/div>\n\n\n\n<p><strong>Intera\u00e7\u00e3o com Bancos de Dados:<\/strong> Ao trabalhar com bancos de dados, <code>Null<\/code> \u00e9 utilizado para representar campos sem valor (NULL) nas tabelas.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >if VarIsNull(DataSet.FieldByName('Nome').Value) then\n  ShowMessage('Nome n\u00e3o definido');\n<\/pre><\/div>\n\n\n\n<p><strong>Como funciona:<\/strong><\/p>\n\n\n\n<p><code>Null<\/code> \u00e9 uma constante predefinida no Delphi que retorna uma variante nula. Opera\u00e7\u00f5es aritm\u00e9ticas ou l\u00f3gicas envolvendo <code>Null<\/code> geralmente resultam em <code>Null<\/code>, e compara\u00e7\u00f5es com <code>Null<\/code> devem ser feitas usando fun\u00e7\u00f5es espec\u00edficas, como <code>VarIsNull<\/code>, pois compara\u00e7\u00f5es diretas podem n\u00e3o produzir os resultados esperados.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u00c9 importante diferenciar <code>nil<\/code> e <code>Null<\/code> no Delphi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>nil<\/code><\/strong> \u00e9 utilizado para indicar a aus\u00eancia de uma refer\u00eancia v\u00e1lida para objetos ou ponteiros.<\/li>\n\n\n\n<li><strong><code>Null<\/code><\/strong> \u00e9 utilizado para representar a aus\u00eancia de valor em variantes, especialmente em contextos de banco de dados.<\/li>\n<\/ul>\n\n\n\n<p>Compreender essas distin\u00e7\u00f5es \u00e9 fundamental para evitar erros comuns e garantir a robustez do seu c\u00f3digo em Delphi.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Boas Pr\u00e1ticas para Evitar <code>nil<\/code> e <code>null<\/code><\/strong><\/p>\n\n\n\n<p><strong>1. Utilize Objetos Padr\u00e3o (Null Object Pattern)<\/strong><\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >type\n  TCliente = class\n    procedure ExibirMensagem; virtual;\n  end;\n\n  TClienteNulo = class(TCliente)\n    procedure ExibirMensagem; override;\n  end;\n\nprocedure TCliente.ExibirMensagem;\nbegin\n  WriteLn('Cliente v\u00e1lido.');\nend;\n\nprocedure TClienteNulo.ExibirMensagem;\nbegin\n  WriteLn('Nenhuma a\u00e7\u00e3o necess\u00e1ria para cliente nulo.');\nend;\n\nvar\n  Cliente: TCliente;\nbegin\n  Cliente := TClienteNulo.Create;\n  Cliente.ExibirMensagem;\nend;\n<\/pre><\/div>\n\n\n\n<p><strong>#Dica do Mestre:<\/strong> O Null Object Pattern simplifica a l\u00f3gica e evita exce\u00e7\u00f5es de acesso a objetos nulos.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<p><strong>2. Centralize o controle das inicializa\u00e7\u00f5es<\/strong><\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >type\n  TClienteFactory = class\n  public\n    class function CriarCliente: TCliente;\n  end;\n\nclass function TClienteFactory.CriarCliente: TCliente;\nbegin\n  Result := TCliente.Create;\nend;\n\nvar\n  Cliente: TCliente;\nbegin\n  Cliente := TClienteFactory.CriarCliente;\nend;\n<\/pre><\/div>\n\n\n\n<p>Isso evita confus\u00f5es e garante que os objetos sejam corretamente configurados ao serem criados.<\/p>\n\n\n\n<p>3. Evite depend\u00eancia excessiva de checagens de nil<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >if Assigned(Cliente) then\n  Cliente.Processar\nelse\n  \/\/ Fa\u00e7a algo aqui.\n<\/pre><\/div>\n\n\n\n<p>Melhora abordagem:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >Cliente := TClienteNulo.Create;\nCliente.Processar;\n<\/pre><\/div>\n\n\n\n<p>4. Adote bibliotecas e frameworks de checagens de nil<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >var\n  Nome: Nullable&lt;string&gt;;\nbegin\n  Nome := 'John Doe';\n  if Nome.HasValue then\n    WriteLn(Nome.Value)\n  else\n    WriteLn('Nome n\u00e3o definido.');\nend;\n<\/pre><\/div>\n\n\n\n<p><br><\/p>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Participe da Comunidade no Telegram<\/h3>\n\n\n\n<p>\ud83d\ude80 Quer continuar essa discuss\u00e3o e trocar ideias com outros desenvolvedores? Junte-se \u00e0 nossa comunidade no Telegram! L\u00e1, voc\u00ea pode comentar sobre o que achou deste artigo, tirar suas d\u00favidas e compartilhar suas experi\u00eancias com Delphi e ainda discutir ou tirar suas d\u00favidas sobre os mais variados temas em uma comunidade com mais de 1.000 desenvolvedores.<\/p>\n\n\n\n<p>\ud83d\udd17 <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\" target=\"_blank\" rel=\"noreferrer noopener\">Clique aqui para entrar na comunidade<\/a><\/p>\n\n\n\n<p>Te vejo l\u00e1!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h3>\n\n\n\n<p>Evitar o uso excessivo de <code>nil<\/code> e <code>null<\/code> em Delphi \u00e9 uma quest\u00e3o de design e manuten\u00e7\u00e3o de c\u00f3digo. Com padr\u00f5es como Null Object e ferramentas como Spring4D, voc\u00ea pode transformar o seu c\u00f3digo em algo mais seguro, eficiente e elegante. Experimente essas pr\u00e1ticas e veja como elas podem mudar sua forma de programar.<\/p>\n\n\n\n<p>Tem alguma d\u00favida ou dica para compartilhar? Deixe nos coment\u00e1rios, e at\u00e9 a pr\u00f3xima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em Delphi, lidar com refer\u00eancias a objetos \u00e9 uma tarefa que parece simples \u00e0 primeira vista, mas pode esconder armadilhas perigosas. Se voc\u00ea j\u00e1 se deparou com mensagens de erro ao acessar um objeto &#8220;nulo&#8221;, sabe o impacto que isso pode causar. E agora, como resolver? \u00c9 uma boa ideia usar nil ou null para [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":952,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-951","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=951"}],"version-history":[{"count":4,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/951\/revisions"}],"predecessor-version":[{"id":956,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/951\/revisions\/956"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/952"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=951"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}