首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么人们在他们的代码中使用魔术值而不是null?

为什么人们在他们的代码中使用魔术值而不是null?
EN

Stack Overflow用户
提问于 2009-02-26 16:45:01
回答 6查看 1.8K关注 0票数 9

我在遗留代码和一些.NET开源项目中看到了这一点。我想不出这样做的理由。在我看来,仅仅使用"null“就容易多了。

示例:

代码语言:javascript
复制
public class Category
{
   int parentID;

   bool HasParent
   {
      get
      {
          return parentID != -1;
      }
   }
}

对比

代码语言:javascript
复制
public class Category
{
   int parentID;

   bool HasParent
   {
      get
      {
          return parentID != null;
      }
   }
}
EN

回答 6

Stack Overflow用户

发布于 2009-02-26 17:48:24

因为要有一个"null“值,类型必须是可以为null的。这对于引用类型(您定义的任何类和标准库)都很有效,如果您查看一下,就会发现只要有一个没有值的引用对象,人们就会使用null

代码语言:javascript
复制
Employee employee = Employees.Find("John Smith");
if(employee == null) throw new Exception("Employee not found");

当你使用int、char或float这样的值类型时,问题就来了。与指向内存中其他位置的数据块的引用类型不同,这些值是以内联方式存储和操作的(没有指针/引用)。

因此,默认情况下,值类型没有空值。在您提供的代码中,parentID为空是不可能的(实际上我很惊讶,即使是您的编译器也得到了这一点- Visual Studio2008和2005可能会画一条绿色的下划线,并告诉您该语句始终为假)。

为了使int具有null值,需要将其声明为nullable

代码语言:javascript
复制
int? parentID;

现在parentID可以包含NULL值,因为它现在是指向32位整数的指针(很好地说是“引用”),而不仅仅是32位整数。

因此,希望您能理解为什么“魔术值”经常用于表示具有基本类型(值类型)的null。将这些值类型存储为对值的引用,以允许它们为空,这是非常麻烦的,而且通常会对性能造成很大的影响(查找什么是装箱/拆箱)。

编辑:有关装箱/拆箱(拥有int==null所需的内容)的更多参考,请参阅MSDN上的文章

装箱和拆箱《C#编程指南》

性能

对于简单的赋值,装箱和拆箱都是计算量很大的过程。当一个值类型被装箱时,必须分配和构造一个新对象。在较小的程度上,拆箱所需的强制转换在计算上也很昂贵。有关更多信息,请参见Performance。

票数 11
EN

Stack Overflow用户

发布于 2009-02-26 17:24:08

这通常是在用C编程时养成的习惯。许多C程序员会因为浪费可空的in而感到老练,因为这至少需要一个完整的额外位,甚至可能需要一个指针。当您知道该值将为正值,并且您有整个负值空间可用于标记时,这尤其糟糕。可以表示-1 \f25 not set -1\f6,可以表示-2 \f25 parentId -2\f6在该节点的上下文中没有意义,-3 \f25-3\f25-3\f25 node -3\f6可以表示该节点的父节点不能处理工作,留下大量饮酒,再也看不到它了,等等。

在C#的世界中,可空int的干净(以及它们与RDMS的轻松集成)以及带有2GB+的计算机意味着旧的C习惯正在慢慢消失,但旧习惯很难消失。

票数 4
EN

Stack Overflow用户

发布于 2009-02-26 16:49:07

拥有null对象可能导致抛出异常,而错误代码(如"-1“失败情况)不会抛出异常。

这在不能很好地处理异常的语言或应用程序中可能是至关重要的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/591384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档