null确实有什么价值?

时间:2009-08-14 16:34:17

标签: c# java language-agnostic null object

(我知道null是什么以及它用于什么)

问题:好的,我们说用任何语言引用一个对象。计算机在内存中为该参考创建一个32位(或其他大小,取决于计算机的设计)空间。可以将该内存分配给表示对象在内存中的位置的值。但是当我将引用设置为null时,它真正具有什么价值? (参考集中的各个位是什么)这些位是否刚刚清零?但那也不是记忆中的一个位置吗?计算机如何告诉引用包含null而不是对象的引用?

我知道这不是一个“重要”的问题,但我很好奇它是如何运作的。

谢谢你们:D

8 个答案:

答案 0 :(得分:14)

答案有两半:

  • 值为零(即,值中的所有位均为零)
  • 零永远不会被视为有效地址。

第二点是为什么回答你的问题“但这不也是记忆中的位置吗?”是“否” - 它只是一个规则,零不被视为有效的内存位置。试图访问它会导致异常。

编辑: According to Wikipedia(因此必须为8-)“某些架构使用带符号的地址空间并使用最负值”。因此,它不一定对所有体系结构都是零,但无论它在给定体系结构上具有什么价值,该值都被视为无效的内存位置。

答案 1 :(得分:8)

在.NET中,空值由“全零”位模式表示。

这很重要,因为这意味着正确创建新数组或对象只涉及擦除内存以在开始调用构造函数,变量初始化器等之前为所有字段创建适当的默认值。

(我一直试图找到这个指定的位置,到目前为止我失败了......但这是唯一有意义的实现。我会继续寻找。)

答案 2 :(得分:7)

来自C ++背景,在讨论指针时,NULL的标准定义是0.我会假设其他语言的工作方式类似。

答案 3 :(得分:4)

回答c#

CLR的操作码为null。

   String s = "ff";

   s = null;

生成此IL

  .locals init ([0] string s)
  IL_0000:  nop
  IL_0001:  ldstr      "ff"
  IL_0006:  stloc.0
  IL_0007:  ldnull
  IL_0008:  stloc.0

如您所见,有一个ldnull操作码处理null

的特殊值

答案 4 :(得分:3)

并非所有语言都使用特定值,有时null是对象。动态语言通常具有全局对象,该对象表示当没有值时对象引用设置为null。在这些情况下,可以对null对象进行方法调用,并创建适当的响应。

例如在Ruby中有一个名为nil的单例和常用方法,如or,nil?和to_s都有适当的默认实现,如果在null对象上调用它们,你会期望它们。

在Java中,在虚拟机规范中彻底指定了null。它的实际值并没有真正指定,而是在字节代码指令看到它时会发生什么。

通常通过将对象引用设置为指向nil对象来“处理”Null。但抽象较低的语言可能使用零作为内存中的位置值,但操作系统会停止程序实际写入,而不是核心转储或以其他方式暂停程序。

答案 5 :(得分:2)

  

计算机如何判断引用包含null而不是对象的引用?

根据Wikipedia,某些语言中的空指针可能是内存中的固定地址,用户程序可能无法访问,因此如果某个对象指向此地址,则为空,否则为空

答案 6 :(得分:1)

RAM的第一页通常受到保护,不受用户空间程序的影响。这样,如果程序员忘记检查空指针,当程序试图访问该位置时,程序将至少导致页面错误。

因此,虽然[0x00000000]在技术上是一个真正的内存位置,但大多数程序都无法访问它。

x86处理器在那里有一个特殊的表,如果我没记错的话。

答案 7 :(得分:0)

http://googleit1st.com/search?hl=en&q=null+pointer

空指针或空引用 Null是一个特殊的指针值(或其他类型的对象引用),用于表示指针故意不指向(或引用)对象。这样的指针称为空指针。1许多实现使用值0(所有位为零)来表示空指针,因为它位于大多数CPU的地址空间的底部(尽管某些体系结构使用签名的地址空间并使用最负值)。当尝试访问此内存地址时,许多操作系统会生成异常。有些语言使用其他命名法来表示这样的指针,例如,Pascal,Ruby和Lua使用nil 2,Visual Basic使用Nothing,而Python使用None。 Fortran不认为null是常量,而是可以由NULLIFY指令设置并由ASSOCIATED函数测试的属性。 Taken from wikipedia