`
RednaxelaFX
  • 浏览: 3049265 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Nullable的诡异之处……

    博客分类:
  • C#
阅读更多
原来Nullable type是null的时候,以它作为被调用对象是不会得到NullReferenceException的。以前都没发现,得小心点才行……

引用Steve Wellens在CodeProject上发表的C# Nullable Types…Subtlety
 int Test1 = 0;  // standard value type
 int? Test2 = null; // nullable value type  
 Object Test3 = null; // reference type

 Response.Write("Test1: " + Test1.ToString() + "<br />");
 Response.Write("Test2: " + Test2.ToString() + "<br />");
 //Response.Write("Test3: " + Test3.ToString() + "<br />");

 // Output:
 //
 // Test1: 0 // correct
 // Test2: // no exception, what? but it's null!
 //
 // If Test3 is allowed to run, we get:
 // "Object reference not set to an instance of an object."

(他这段代码是在ASP.NET里测试的,所以是用Response.Write())

更新:
参照下面的回复:Nullable<T>是值类型,自身不会为null。使执行int? Test2 = null;之后,Test2指向的是一个代表null的Nullable<int>的实例,所以后面自然不会有异常。
分享到:
评论
6 楼 kangyiwei 2010-06-11  
ToString被重写了

public override string ToString()
{
    if (!this.HasValue)
    {
        return "";
    }
    return this.value.ToString();
}
5 楼 RednaxelaFX 2009-06-04  
beyondest 写道
首先看第一句。Nullable<T>是值类型,Test2不可能为null。

嗯,说得没错,后来我也知道了,不过这帖一直忘了更新。多谢提醒 ^ ^
4 楼 beyondest 2009-06-03  
这个没有什么诡异的。

int? Test2 = null;
Test2.ToString();

首先看第一句。Nullabla<T>是值类型,Test2不可能为null。

实际上int? Test2 = null执行后,Test2根本不是null,而是栈上一个Nullabla<System.Int32>的实例。所以调用Test2.ToString()不会抛NullReferenceException。

当前Test2的hasValue被初始化为false。如果这时调用Test2的Value,会抛异常。
3 楼 garfeildma 2009-04-03  
引用
Tests? 是指string类型的变量赋值为null然后输出么?
要注意单参数的Console.WriteLine()本身是不介意参数是null的,


写错了,Test3.

又试了一下的确这样
                
                int Test1 = 0;  // standard value type   
                int? Test2 = null; // nullable value type     
                Object Test3 = null; // reference type   

                Console.WriteLine(Test1);
                Console.WriteLine(Test2.ToString());
                Console.WriteLine(Test3.ToString());


用Reflector看到是这样的
            int num = 0;
            int? nullable = null;
            object obj2 = null;
            Console.WriteLine(num);
            Console.WriteLine(nullable.ToString());
            Console.WriteLine(obj2.ToString());
2 楼 RednaxelaFX 2009-04-03  
garfeildma 写道

我试了一下Console.WriteLine(Tests)也不会报错

Tests? 是指string类型的变量赋值为null然后输出么?
要注意单参数的Console.WriteLine()本身是不介意参数是null的,
class Class1 {    
    static void Main(string[] args) {
      string s = null;
      System.Console.WriteLine(s);
    }
}

这个没问题。问题是在.ToString()那里。被调用的对象如果是null的话,这里就会抛NullReferenceException,
class Class1 {    
    static void Main(string[] args) {
      string s = null;
      System.Console.WriteLine(s.ToString());
    }
}

这样就有问题了。
但把这个例子里的string换成int?之后又没问题了,所以说诡异……本来Nullable应该跟其它引用类型保持一致的语义才对。
1 楼 garfeildma 2009-04-03  
我试了一下Console.WriteLine(Tests)也不会报错

相关推荐

    javax Nullable 标签的jar

    使用javax Nullable注解必须使用的jar包

    Laravel开发-nullable

    在Laravel框架中,`nullable`是一个非常实用的特性,特别是在处理数据模型(Eloquent)时,它允许我们在不抛出异常的情况下对可能为null的对象进行链式调用。这个特性提高了代码的健壮性和可读性,因为它使得开发者...

    Nullable转换问题

    ### Nullable转换问题 在.NET框架中,`Nullable&lt;T&gt;`是一种非常重要的类型,它允许值类型存储空值。这对于处理数据库中的可选字段等场景极为有用。本文将通过一个具体的示例来详细介绍`Nullable`类型的使用及其转换...

    Laravel开发-laravel-nullable

    在Laravel框架中,`nullable`是一个非常实用的特性,特别是在数据库交互和Eloquent ORM(对象关系映射)中。这个特性允许我们在定义模型的属性时声明某些字段是可以为空的,即使在数据库层面这些字段被定义为非空。...

    java中使用@Nullable 注解的详细用法

    所以补充上了,随后又同事问我在代码中发下了@Nullable注解不知道怎么用?脑子是个好东西,可以审核没带啊!哪有广告? 起初,以为这么简单的一个常用注解还不了解吗? 用法 @Nullable可以用在方法、属性、参数上...

    (GOOD,PASS)LINQ TO DATATABLE OR DATASET 完美解决方案,可排除DATASET不支持System.Nullable错误,并为GRIDVIEW增加空行

    根据给定的信息,本文将详细解释如何通过 LINQ 来操作 DataTable 或 DataSet,并解决其中遇到的一些常见问题,例如处理 Nullable 类型以及如何为 GridView 控件添加空行。 ### 一、理解 LINQ to DataTable or ...

    Laravel开发-nullable .zip

    在Laravel框架中,`nullable`是一个非常关键的概念,它主要与数据库字段的验证和迁移有关。本压缩包文件“Laravel开发-nullable .zip”可能包含关于如何在Laravel项目中处理可空数据的教程、示例代码或相关资源。在...

    PHP7.1新功能之Nullable Type用法分析

    现在,通过使用Nullable Type,我们可以明确指定某个参数或返回值可以为null,从而使代码逻辑更加清晰和健壮。 在PHP5时代,虽然函数的参数已经支持了类型提示(typehint),但参数必须是非null的,例如int, string...

    jackson-databind-nullable-0.1.0.jar

    java运行依赖jar包

    iOS 泛型中nullable、null resettable、null kindof 用法详解

    自iOS 9以来,Apple引入了几个新的关键字来帮助开发者更好地声明和管理可空性,这些关键字包括`nullable`、`nonnull`、`null_resettable`以及`_Null_unspecified`。本文将详细讲解这些关键字的用途、用法和注意事项...

    C#难点逐个击破(8):可空类型System.Nullable

    在C#编程语言中,可空类型(System.Nullable)是一个重要的特性,它允许开发者为原本不可为空的值类型(如int、double等)赋予null值。...理解并恰当使用可空类型是成为熟练C#程序员的关键技能之一。

    可变参数、不定参数和nullable、nonnull

    可变参数、不定参数Demo源码,nullable、nonnull、_Nullable 等区别Demo源码。 博客地址: https://dcsnail.blog.csdn.net/article/details/79107962 https://dcsnail.blog.csdn.net/article/details/79230770

    javafileread源码-NullableExtract:一个快速而肮脏的项目,用于读取带有@Nullable批注的类文件并输出相应的Ja

    一个快速而肮脏的项目,用于读取带有@Nullable批注的类文件并输出相应的Java源代码。 仅生成存根类,并且仅包含具有@Nullable批注的方法。 生成的源代码是格式正确的Java,但不能替代原始类文件。 至少可以在中分发...

    解决Django 在ForeignKey中出现 non-nullable field错误的问题

    在这个问题中,我们遇到了在添加外键时遇到的“non-nullable field”错误。这通常发生在尝试迁移(migrate)模型变更到数据库时,Django提示你需要为外键提供一个默认值,即使Django本身并没有强制要求所有外键都有...

    详解c# 可空类型(Nullable)

    Nullable&lt;int&gt; i = new Nullable(3); int i; //默认值0 int? ii; //默认值null ?? : 双问号 可用于判断一个变量在为 null 时返回一个指定的值。 接下来我们详细说明。 C# 可空类型(Nullable) C# 提供了一个特殊的...

    laravel-nullable-field:自动为laravel中的空字段设置空值

    Laravel的可空数据库字段 通常,未分配值的数据库字段默认为null 。 在创建具有外键约束的记录时,这一点尤其重要。...为了使用此特征,请将其导入到Eloquent模型中,然后将受保护的$nullable属性设置为一个字

    ELinq 是一个轻量简单易用的开源Linq ORM数据访问组件,支持Nullable类型和枚举类型.zip

    ELinq 是一个轻量简单易用的开源Linq ORM数据访问组件,支持Nullable类型和枚举类型,支持根据实体类自动建库建表建关系,支持根据数据库通过T4模版自动生成实体代码,对Linq的谓词提供了完美的支持,旨在让绝大部份...

Global site tag (gtag.js) - Google Analytics