Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c#,java中什么是空值?_C#_Java_Null - Fatal编程技术网

在c#,java中什么是空值?

在c#,java中什么是空值?,c#,java,null,C#,Java,Null,像。。。像C++一样,是 0 吗?还是某个“特殊”物体?或者完全不同的东西 --编辑-- 我确实知道它是什么,问题是-它是如何完成的这是null是一个“引用”什么都没有,所以它指向了什么 其他信息:C#引用类型可以指向null(即:nothing),像int这样的值类型不能指向null,尽管valuetype可以在可为null的泛型引用类型中使用。它与 #define NULL (void*)0 C++中的P>所以基本上,是的,它是零 编辑: 因为我显然没有正确地说出这个答案 我的意思是: 由

像。。。像C++一样,是<代码> 0 <代码>吗?还是某个“特殊”物体?或者完全不同的东西

--编辑--

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

这是

null是一个“引用”什么都没有,所以它指向了什么

其他信息:C#引用类型可以指向null(即:nothing),像int这样的值类型不能指向null,尽管valuetype可以在可为null的泛型引用类型中使用。

它与

#define NULL (void*)0
C++中的P>所以基本上,是的,它是零

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

我的意思是:

由于C#在虚拟机中运行,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。

这是一个特殊引用(用于区分它与0),它指向零。

:

还有一种特殊的null类型,即 表达式null的类型,该类型具有 没有名字。因为null类型没有 名称,不可能声明 null类型的变量或要强制转换的变量 设置为空类型。空引用 是的唯一可能值 空类型的表达式。空值 引用始终可以转换为任何 引用类型。实际上 程序员可以忽略空类型 假装null仅仅是一个 可以是任何类型的特殊文字 引用类型

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

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

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

来自Microsoft MDSN:


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

因为您询问的是实现细节,而不是语义,所以答案特定于给定的实现

C#中有三个“null”可以是空的。引用、指针和可为空的类型

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

毫不奇怪,空指针的表示方式是相同的。您可以在C#中演示这一点,方法是创建一个不安全的块,创建一个指向void的空指针,然后将其转换为IntPtr,然后将IntPtr转换为int(或long,在64位系统上)。当然,你会得到零分

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

智力?j=零

我们实际创造的东西在道德上等同于:

struct NullableInt 
{
    int value;
    bool hasValue;
}
使用适当的访问器方法,等等。当其中一个被赋值为null时,我们就用零位填充整个内容。该值是整数零,hasValue用零填充,因此变为false;hasValue字段设置为false的可为null的类型被视为null


我不知道C#/CLI的其他实现的实现细节是什么。如果他们不一样,我会感到惊讶;这是实现null的明显而明智的方法。但是,如果您对具体的实现细节有疑问,您必须询问了解您感兴趣的实现的人。

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

一个简短的谷歌搜索可能会回答您的问题:例如……投票通过。这是一个很好的海龟问题。@Bishiboosh编程问答网站也是如此。@Bishiboosh我知道它是什么,问题是“它是如何完成的”…-1:null在C#中不是一个值类型。这充其量也过于简单化了。对于C++来说,学究式的理解是:在指针上下文中计算的等于零的编译时常量整数是一个空指针常量。也就是说,零是在代码中编写空指针常量的方式,但运行时的空指针不是零。实际上,空指针是0。它指的是0x00000000:00000000的内存地址,在Windows和Linux中,它是一个空指针。把问题再读一遍。在我看来,他明白null的意思,他想知道它是如何实现的。它的工作方式和C++一样。哦,我想说的是,我只讲C语言。不太熟悉java来回答这个问题……TJMunk:“哦,我想说的是,我只讲C语言。”——C++代码。C#null不一定要指向0地址……这是真的,但对于我反常的“需要知道”的东西来说,物理上用来表示null的东西对我来说很重要;)正如我所说的:对于每个JVM或.NET实现来说,这可能是不同的,作为一个实现细节,它并没有被广泛发布。Doh,看到相同的东西会很奇怪。。。因为它没有被广泛发布-我来到这里,所以可能有人知道…这解释了null关键字,但不是null引用是如何实现的。