zoukankan      html  css  js  c++  java
  • 详细了解 int? 类型

    一、int?是什么

    二、了解Nullable结构体

    三、Nullable类型的取值与转换

             1.GetValueOrDefault

             2.运算符重载

     


    一、int?是什么

    说到int?,或者double?,平时只是在接收数据库传来的可空值类型数据时用用。

    但int既然是值类型,不能为空,为什么int?就可空了呢,引用类型才是可空的,难道int?是引用类型?

    测试一下吧:

    1. 写一句int?=3,看看反编译结果

     

    2. 编译结果里有关键字new,我们也new一个试试

    结果发现int?有两个重载

    重载1:

     

    重载2:

     

    重载2包含一个int型参数,并解释说会实例化一个Nullable<T>结构体

     


    3. 手动实例化Nullable<T>

    发现Nullable<int> test=new Nullable<int>(1);这样的写法是可行的

    下面是三种不同的写法及其反编译代码:

     

     

    可见,这三种写法是等价的。

     


    二、了解Nullable结构体

    Nullable结构体长这样:

     

    但既然int? 是Nullable结构体的特例,为什么就可以赋值为null呢?

    模仿上面的Nullable自己封装一个Nullable1并使用,看看效果

     

    结果是Nullable可以赋值为null,自己写的Nullable1却不可以,而且Nullable与Nullable1两个类型的颜色还有点深浅的区别,很奇怪

    把错误的代码屏蔽,反编译看看IL代码,Nullable<int> e=null;对应的是这样的

     

    把Nullable<int> e=null; 改为Nullable<int> e=1;再看看结果:

     

    再找一个引用类型并赋值为null,比如string s=null; 的IL代码为:

     

    可见对于Nullable<int> e=null;来说,null对应的IL码为initobj;而对于string s=null来说null对应的IL码则是idnull,这两个地方的null是不同的

    但我们不是也可以用e==null这样的写法吗,难道这儿的null也是特殊的用法

    继续测试代码,结果为true

     

     

    反编译

     

    原来这儿的d==null相当于!d.HasValue

    HasValue属于Nullable结构体的成员

    对这一系列现象不清楚了,可能Nullable<int> e=null中的null用来特指Nullable结构体中Value为空时的状态吧,恳请大神指教


    三、Nullable类型的取值与转换       

    最后再试试Nullable结构体中的两个GetValueOrDefault方法以及两个运算符重载

    1. GetValueOrDefault

    对于为空的变量,GetValueOrDefault()会返回0;GetValueOrDefault(T defaultValue)则会返回指定的defaultValue的值。

    另外,c# 7.0的新语法“??”与这个方法有相同的作用

     

    2.运算符重载

    显式运算符重载:

     

     

    隐式运算符重载:

     

    显式重载的参数为可空值类型,返回结果为Nullable结构体的Value属性;

    隐式重载的参数为普通值类型,返回结果为一个Nullable结构体,同时其Value属性已经被赋值

    比如,有两个参数a、b

    int a;

    int? b=0;

     

    将b赋值给a,会使用显式重载,要写成a = (int)b;

    而将a赋值给b,则会使用隐式重载,可直接b = a;

     

  • 相关阅读:
    javascript基础之两种函数的定义方法
    与input有关的一些操作
    SpringMVC(八) RequestMapping HiddenHttpMethodFilter
    SpringMVC(七) RequestMapping 路径中带占位符的URL
    SpringMVC(六) RequestMapping 路径中ant风格的通配符
    SpringMVC(五) RequestMapping 请求参数和请求头
    SpringMVC(四) RequestMapping请求方式
    SpringMVC(三) RequestMapping修饰类
    SpringMVC(二) SpringMVC Hello World
    SpringMVC(一) SpringMVC概述
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/6705412.html
Copyright © 2011-2022 走看看