zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    网页转图片,html生成图片,网页生成图片(基于linnux+phantomjs)和wkhtmltoimage
    51Nod 1031 骨牌覆盖 | Fibonacci
    51Nod 1024 矩阵中不重复的元素 | 技巧 数学
    51Nod 1014 X^2 Mod P
    51Nod 1010 只包含因子2 3 5的数 | 预处理+二分
    51Nod 1007 正整数分组 | DP (01背包)
    51Nod 1381 硬币游戏 | 概率(数学期望)
    51Nod 1347 旋转字符串 | 规律
    51Nod 1344 走格子 | 贪心
    51Nod 1305 Pairwise Sum and Divide | 思维 数学
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/10675829.html
Copyright © 2011-2022 走看看