• C# --- 可空值类型


    C#可空类型的实现逻辑:

     1 public struct Nullable<T> where T : struct
     2 {
     3     private bool hasValue;// = false;
     4     internal T value;// = default(T);
     5 
     6     public Nullable(T val)
     7     {
     8         value = val;
     9         hasValue = true;
    10     }
    11 
    12     public bool HasValue
    13     {
    14         get
    15         {
    16             return hasValue;
    17         }
    18     }
    19 
    20     public T Value
    21     {
    22         get
    23         {
    24             if (!hasValue)
    25             {
    26                 throw new InvalidOperationException("Nullable object must have a value");
    27             }
    28             return value;
    29         }
    30     }
    31 
    32     public T GetValueOrDefault()
    33     {
    34         return value;
    35     }
    36 
    37     public T GetValueOrDefault(T defaultValue)
    38     {
    39         if (!HasValue)
    40             return defaultValue;
    41         return value;
    42     }
    43 
    44     public override bool Equals(object other)
    45     {
    46         if (!HasValue)
    47             return other == null;
    48 
    49         if (other == null)
    50             return false;
    51 
    52         return value.Equals(other);
    53     }
    54 
    55     public override int GetHashCode()
    56     {
    57         if (!HasValue) return 0;
    58         return value.GetHashCode();
    59     }
    60 
    61     public override string ToString()
    62     {
    63         if (!HasValue)
    64             return "";
    65 
    66         return value.ToString();
    67     }
    68 
    69     //隐式的类型转换
    70     public static implicit operator Nullable<T>(T value)
    71     {
    72         return new Nullable<T>(value);
    73     }
    74 
    75     //显式的类型转换
    76     public static explicit operator T(Nullable<T> value)
    77     {
    78         return value.Value;
    79     }
    80 }

    1、装箱与拆箱

      可空值类型的装箱:若可空值类型的为null,直接返回null,不进行任何装箱操作;否则进行正常的装箱操作.

      可空值类型的拆箱操作:一个已装箱的值类型 T 可以拆箱为一个 T 或者 Nullable<T>;若已装箱的值类型为 null,拆箱为Nullable<T>,其值为 null

    1 Object obj = 5;  //值类型装箱
    2 
    3 Int32 valObj = (Int32)obj;
    4 Nullable<Int32> nullableObj = (Nullable<Int32>)obj;
    5 
    6 
    7 obj = null;
    8 nullableObj = (Nullable<Int32>)obj;     //null
    9 valObj = (Int32)obj;                    //报异常

    2、通过可空值类型调用 GetType(),结果是对应的值类型

    1 Nullable<Int32> test = 147;
    2 Console.WriteLine(test.GetType());   //结果是 System.Int32,而不是 Nullable<Int32>

    3、通过可空值类型调用接口方法,可正常使用

    1 Nullable<Int32> val = 41;
    2 Int32 result = ((IComparable)val).CompareTo(41);
    3 Console.WriteLine(result);     //0
  • 相关阅读:
    #leetcode687.最长同值路径
    #leetcode404.所有左叶子节点之和
    #leetcode111.二叉树的最小深度
    #leetcode101.对称二叉树
    #leetcode437.路径总和II
    #leetcode112.路径总和
    #leetcode543.二叉树的直径
    #leetcode110.平衡二叉树
    springboot数据库密码加密-使用自定义加密算法
    PHP加密
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/10675829.html
Copyright © 2020-2023  润新知