{"id":1023,"date":"2009-11-05T23:46:00","date_gmt":"2009-11-05T23:46:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2009\/11\/05\/spot-the-bug-much-ado-about-nothing-part-2-jonathan-aneja\/"},"modified":"2024-07-05T12:42:35","modified_gmt":"2024-07-05T19:42:35","slug":"spot-the-bug-much-ado-about-nothing-part-2-jonathan-aneja","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/spot-the-bug-much-ado-about-nothing-part-2-jonathan-aneja\/","title":{"rendered":"Spot the Bug! &#8211; Much ado about Nothing&#8230; Part 2! (Jonathan Aneja)"},"content":{"rendered":"<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">In <a href=\"http:\/\/blogs.msdn.com\/vbteam\/archive\/2009\/11\/03\/spot-the-bug-much-ado-about-nothing-jonathan-aneja.aspx\">yesterday&rsquo;s<\/a> post we saw that the use of the wrong comparison operator with Nothing in an If block can lead to surprising results.<span>&nbsp; <\/span>Let&rsquo;s look at a slightly different case today:<\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> x <span>As<\/span> <span>Integer<\/span> = <span>Nothing<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>If<\/span> x = <span>Nothing<\/span> <span>Then<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;A true statement &#8211; we land here&#8221;<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Else<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;The statement is a lie &#8211; we land here&#8221;<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNoSpacing\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>If<\/span><\/span><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font face=\"Calibri\"><font size=\"3\">What gets printed?<span>&nbsp; <\/span>If the code is intended to print &ldquo;A true statement&hellip;&rdquo;, <i>is there actually a bug in this code?<\/p>\n<p><\/i><\/font><\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">.<\/font><\/p>\n<p class=\"MsoNoSpacing\"><b><\/p>\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<p><\/b><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\"><font face=\"Calibri\"><b>Answer:<span>&nbsp; <\/span><\/b>The code is correct according to its &ldquo;specification&rdquo; (I&rsquo;m using the term loosely here <\/font><span><span>J<\/span><\/span><font face=\"Calibri\">), so from a technical point of view there is no bug here.<span>&nbsp;&nbsp; <\/span><i>However<\/i>, from a code readability and maintenance point of view, I&rsquo;d argue that there is a bug.<\/font><\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\" face=\"Calibri\">The Nothing literal in VB means &ldquo;default value for this type&rdquo;, and for an Integer that would be 0.<span>&nbsp; <\/span>So the code above is <i>exactly<\/i> equivalent to this:<\/font><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>Dim<\/span><span> x <span>As<\/span> <span>Integer<\/span> = 0<span><\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><\/p>\n<p>&nbsp;<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>If<\/span> x = 0 <span>Then<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;A true statement &#8211; we land here&#8221;<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Else<\/p>\n<p><\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>MsgBox(<span>&#8220;The statement is a lie &#8211; we land here&#8221;<\/span>)<\/p>\n<p><\/span><\/p>\n<p class=\"MsoNoSpacing\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>If<\/span><\/span><\/p>\n<p class=\"MsoNoSpacing\">\n<p><font size=\"3\" face=\"Calibri\">&nbsp;<\/font><\/p>\n<\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\"><font face=\"Calibri\">Now that&rsquo;s <i>way <\/i>more readable than the version above, and dramatically reduces the potential for confusion.<span>&nbsp; <\/span>In general*, if you ever find yourself writing &ldquo;= Nothing&rdquo; in a conditional expression, you should either be changing the = to &ldquo;Is&rdquo; (as we saw yesterday), or you should change Nothing to the actual default value if possible.<span>&nbsp; <\/span><\/font><\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\"><font face=\"Calibri\"><span><\/span><\/font><\/font>&nbsp;<\/p>\n<p><font face=\"Calibri\"><span><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\">The next post will have a real bug, I promise <span><span>J<\/span><\/span><\/font><\/p>\n<p class=\"MsoNoSpacing\"><font size=\"3\"><span><span><\/span><\/span><\/font>&nbsp;<\/p>\n<p><font size=\"3\"><span><span><\/p>\n<p class=\"MsoNoSpacing\"><i><span><font face=\"Calibri\">*Yes, there may be cases such as structure\/generics\/overloaded operators where you actually would want to say &ldquo;= Nothing&rdquo; &ndash; my point is that if you&rsquo;re going to do this make sure you know what you&rsquo;re doing, and insert a comment so that those reading your code also know what you&rsquo;re doing <\/font><\/span><\/i><i><span><span>J<\/span><\/span><\/i><i><span><font face=\"Calibri\">.<\/p>\n<p><\/font><\/span><\/i><\/p>\n<p><\/span><\/span><\/font><\/span><\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In yesterday&rsquo;s post we saw that the use of the wrong comparison operator with Nothing in an If block can lead to surprising results.&nbsp; Let&rsquo;s look at a slightly different case today: &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim x As Integer = Nothing &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If x = Nothing Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox(&#8220;A true statement &#8211; we land here&#8221;) [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[195],"tags":[83,143,165,166,167],"class_list":["post-1023","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-visual-basic","tag-jonathan-aneja","tag-spot-the-bug","tag-vb2005","tag-vb2008","tag-vb2010"],"acf":[],"blog_post_summary":"<p>In yesterday&rsquo;s post we saw that the use of the wrong comparison operator with Nothing in an If block can lead to surprising results.&nbsp; Let&rsquo;s look at a slightly different case today: &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim x As Integer = Nothing &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If x = Nothing Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox(&#8220;A true statement &#8211; we land here&#8221;) [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/1023","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=1023"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/1023\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=1023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=1023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=1023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}