WEB开发网
开发学院软件开发C语言 谈谈值类型与null的判等比较 阅读

谈谈值类型与null的判等比较

 2010-09-30 21:04:11 来源:WEB开发网   
核心提示: 这里重载了==运算符就使得myStuct2==null通过了编译,情况似乎有些诡异,谈谈值类型与null的判等比较(2),因为貌似==两边的类型无法匹配重载的定义!首先,我们尝试在==运算符重载方法中加断点,比如我们这样修改重载方法:publicstaticbooloperator==(MySt

这里重载了==运算符就使得myStuct2==null通过了编译,情况似乎有些诡异,因为貌似==两边的类型无法匹配重载的定义!

首先,我们尝试在==运算符重载方法中加断点,结果观察到里面的代码并没有执行。

自从.NET Framework2.0引入了可空类型,只要你定义了==运算符重载(两个参数类型必须都是原类型才可以),这里C#编译器会认可这个判等表达式,由于一个值类型的实例永远不可能等于可空类型的null,所以这里C#编译器智能的认为这个判等表达式永远为false,我们来看看Main方法的IL

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       9 (0x9)
  .maxstack  2
  .locals init ([0] valuetype ConsoleApplication1.MyStruct2 myStruct2,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  ldc.i4.0
  IL_0003:  ceq         //这里比较的是0和0,这个行为很有趣,==结果是固定的情况下就比较0和0,!=结果固定的情况下比较的是0和1
  IL_0005:  stloc.1    //比较结果放入临时变量CS$4$0000中,但是以后根本就不使用了!
  IL_0006:  br.s       IL_0008    //无条件跳转,if里的代码并没有生成IL
  IL_0008:  ret
} // end of method Program::Main

这里值类型和null的判等比较只有当重载==运算符,并且两个参数类型必须都是原类型才可以,比如我们这样修改重载方法:

            public static bool operator ==(MyStruct2 s1, MyStruct1 s2) //修改第二个参数类型
            {
                return s1.Value == s2.GetHashCode();
            }

这样会出现编译错误了:运算符“==”无法应用于 “MyStruct1” 和 “<null>” 类型

实际上由于值类型和null的比较结果是一定的,所以也没有必要做判等比较,这里只是观察一下C#编译器的一些行为,希望把一些有趣的现象分享给大家!

上一页  1 2 

Tags:谈谈 类型 null

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接