【问题标题】:Is null in c# value type or reference type在c#值类型或引用类型中为null
【发布时间】:2013-07-16 02:55:19
【问题描述】:

本来我的印象是NULL是引用类型,因为它是赋值给引用的,后来又遇到了一个叫做可空值类型的概念,这让我的理论陷入了尴尬的境地,那么NULL值类型到底是不是引用类型呢?

【问题讨论】:

    标签: c# null


    【解决方案1】:

    C# 规范在这一点上很明确:null 关键字表示一个没有类型的表达式。它既不是引用类型,也不是值类型,也不是指针类型。但是,该表达式可转换到所有这些类型。没有要求编译器将所有表达式都分类为具有类型,事实上它没有。

    现在你可能会问在运行时空引用的类型是什么,可为空值类型的空值是什么类型,空指针的类型是什么。答案是:

    • 空引用没有类型。如果你有一个可以装巧克力的盒子,那么问“这个空盒子里的巧克力是什么牌子的?”是没有意义的。丢失的巧克力没有品牌;空引用没有类型。

    • 同样,空指针的类型也不是任何东西。空指针值不指向任何东西。如果你有一张纸,上面写着地址 1600 Pennsylvania Avenue,你可以问“这个地址的房子是什么颜色”,得到答案:白色。如果你有一张空白的纸,问那个地址的房子是什么颜色并不能得到任何有用的答案。

    • 可空值类型的空值是可空值类型的值。

    【讨论】:

    • 这正是我所期待的答案。有时会发现自己没有很好地表达问题,但结合答案的问题准确地表达了我想要弄清楚的内容。
    【解决方案2】:

    null 不是类型。

    来自msdn

    null 关键字是表示空引用的文字,它不引用任何对象。

    Nullable typesNullable<T> 结构的实例,它“表示可以分配为 null 的值类型。

    【讨论】:

      【解决方案3】:

      两者都没有。 null 是引用类型的 default 值,但它本身没有类型。

      可空值类型实际上是作为值类型本身实现的 - 与 null 相比,只有编译器和库技巧可以使它们按预期运行。

      【讨论】:

        【解决方案4】:

        null 在 C# 中本身没有类型,正如这里已经说过的那样。我认为其他答案中缺少一些显示该定义含义的精确示例。

        var something = null;

        无效

        string a = null; // valid. Null is implicitely casted to string.
        int? b = null; // valid. Null is implicitely casted to Nullable<int>.
        var c = "hello" // valid, type of c is infered by the compiler by looking at the right side of the expression.
        
        var d = null; // not valid, compiler can't infer any type from null !
        

        上例中的无效行会导致如下编译错误:

        错误 - CS0815 - 无法分配给隐式类型变量

        还有:

        将 null 传递给重载方法可能需要显式转换

        void myMethod(int? myParam) { }
        void myMethod(string myParam) { }
        
        void test 
        {
            string a = null;
            myMethod(a); // no problem here, a is of type string so 2nd overload will be used.
        
            myMethod(null); // not valid ! Compiler can't guess which one you want.
        
            myMethod((string) null); // valid, null is casted to string so 2nd overload is to be used.
        }
        

        上例中的无效行会导致如下编译错误:

        错误 - CS0121 - 以下方法之间的调用不明确 或属性:'myMethod(string)' 和 'myMethod(int?)'

        【讨论】:

          【解决方案5】:

          null 不引用任何内容。它只是一个类型指向什么。你们通常使用它来取消引用一个对象。

          【讨论】:

            【解决方案6】:

            C# 中的 null 关键字确实表示空引用,因此您可以将其视为引用类型(尽管从技术上讲它表示不是类型)。

            C# 编译器和null 的额外处理,用于可空类型。可以为空的值类型和值类型,实际上永远不可能是null。当您将 Nullable 值类型分配或比较到 null 时,编译器将替换代码。

            例如:

            int? i;
            if (i == null)
                i = 1;
            

            被编译器替换为:

            int? i;
            if (!i.HasVaue)
               i = 1;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-03-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-13
              相关资源
              最近更新 更多