【问题标题】:What is null in c#, java?c#,java中的null是什么?
【发布时间】:2010-01-08 14:51:07
【问题描述】:

就像... 0 就像在 C++ 中一样?或者它是一些“特殊”的对象?或者可能是完全不同的东西?

-- 编辑--

我确实知道它是什么,问题是 - 它是如何完成的

【问题讨论】:

  • 一个简短的谷歌搜索可以回答你的问题:mindprod.com/jgloss/null.html 例如...
  • 投了赞成票。好乌龟问题。
  • @Bishiboosh 编程问答网站也是如此。
  • @Bishiboosh 我知道它是什么,问题是 - “它是如何完成的”......

标签: c# java null


【解决方案1】:

由于您询问的是实现细节,而不是语义,因此答案是特定于给定实现的。

在 C# 中,“null”可以是三样东西。引用、指针和可为空的类型。

在 CLR 上的 C# 实现用零位表示一个空的引用。 (其中位数是适当的大小,可以作为您正在运行的特定 CLR 版本上的托管指针。)

不出所料,空 指针 的表示方式相同。您可以在 C# 中通过创建一个不安全的块、创建一个指向 void 的空指针,然后将其转换为 IntPtr,然后将 IntPtr 转换为 int(或 long,在 64 位系统上)来演示这一点。果然,你会得到零。

一个空的可为空的值类型 也由零实现,尽管方式不同。当你说

int? j = null;

我们实际创造的是道德上的等价物:

struct NullableInt 
{
    int value;
    bool hasValue;
}

使用适当的访问器方法,等等。当其中一个被分配为空时,我们只需用零位填充整个事物。该值是整数零,而hasValue用零填充,因此变为false; hasValue 字段设置为 false 的可空类型被视为空。

我不知道 C# / CLI 的其他实现的实现细节是什么。如果它们不同,我会感到惊讶。这是实现空值的明显且明智的方法。但是,如果您对特定的实施细节有疑问,则必须询问了解您感兴趣的实施的人。

【讨论】:

    【解决方案2】:

    由于 Java 和 C# 运行在虚拟机上,所以物理上用什么来表示 null 并不重要,而且在不同的实现中也不一定相同。

    重要的是 null 的 行为,如语言规范中所定义(有关详细信息,请参阅 Dan 和 MRFerocius 的答案)。基本上,它是一个特殊值,引用类型的变量可以持有,并且不能被取消引用。

    顺便说一句,作为参考点,Java serialization spec 使用单字节值 0x70 来表示空引用。

    【讨论】:

    • 这都是真的,但是对于我这种反常的“需要知道”的事情来说,什么是物理上用来表示 null 的东西对我来说很重要;)
    • 正如我所说:对于每个 JVM 或 .NET 实现来说,这可能会有所不同,并且作为一个实现细节,它并没有被广泛发布。
    • Doh,看到同样的东西会很奇怪......因为它没有被广泛发布 - 我来到这里所以也许有人知道......
    【解决方案3】:

    Java Language Specification section 4.1:

    还有一种特殊的 null 类型,即 表达式 null 的类型,它有 无名。因为 null 类型没有 名称,不可能声明一个 null 类型的变量或强制转换 为空类型。空引用 是一个唯一可能的值 空类型的表达式。空 引用总是可以转换为任何 参考类型。在实践中, 程序员可以忽略 null 类型 并假装 null 只是一个 可以是任何特殊文字 引用类型。

    【讨论】:

      【解决方案4】:

      来自 Microsoft MDSN:

      null 关键字是一个表示空引用的文字,它不引用任何对象。 null 是引用类型变量的默认值。普通值类型不能为空。但是,C# 2.0 引入了可为空的值类型。请参阅可空类型(C# 编程指南)。

      【讨论】:

      • 这里解释了 null 关键字,但没有解释 null 引用是如何实现的。
      【解决方案5】:

      这是null in C#

      【讨论】:

        【解决方案6】:

        这是一个特殊的引用(与 0 区分开来),它指向空。

        【讨论】:

          【解决方案7】:

          null 是对空的“引用”,因此它实际上是空的。

          附加信息:C# 引用类型可以指向 null(即:无),像 int 这样的值类型不能指向 null,尽管值类型可以用于 Nullable 泛型引用类型。

          【讨论】:

            【解决方案8】:

            Null 实际上什么都不是。在某些情况下,某些语言(如 PHP)会将 null 等同于 0、false、空字符串等。 Java 和 C# 是强类型语言。因此,这些“有用的”隐式转换都不会发生。所以 null 实际上是 null 或什么都没有。 Null 仅等于 null。没有其他比较会返回 true。

            【讨论】:

              【解决方案9】:

              相当于

              #define NULL (void*)0
              

              在 C++ 中。所以基本上,是的,它是零。

              编辑: 因为我显然没有正确地说出这个答案......

              我的意思是这样的:

              由于 C# 在 VM 中运行,Michael Borgwardt 所说的是正确的,我们不知道它在幕后是如何表示的。但是,如果您采用以下代码:

                  unsafe static void Main(string[] args)
                  {
                      if (((void*)0) == null)
                          Console.WriteLine("true");
                      else
                          Console.WriteLine("false");
              
                      Console.ReadKey();
                  }
              

              并在控制台应用程序中编译它,启用“允许不安全代码”,您会看到在 c# 中,null 确实等于 (void*) 0。

              【讨论】:

              • -1:C# 中的 null 不是值类型。这充其量只是过于简单化了。
              • 对 C++ 有点迂腐:一个等于 0 的编译时常量整数,在指针上下文中求值,是一个 空指针常量。也就是说,零是您在代码中编写空指针常量的方式,但在运行时空指针为零。
              • 其实空指针是0。它指的是0x00000000:00000000的内存地址,在Windows和Linux下都是空指针。再次阅读问题。在我看来,他理解 null 的含义,他想知道它是如何完成的。它的完成方式与 c++ 相同。
              • 哦,澄清一下,我在这里只谈论 C#。对java不够熟悉,无法回答那部分......
              • @TJMonk:“哦,澄清一下,我在这里只谈论 C#。” -- 那是 C++ 代码。 C# null 不一定非要指向 0 地址...
              猜你喜欢
              • 2011-02-12
              • 1970-01-01
              • 2011-11-24
              • 2012-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多