How does a Nullable type work behind the scenes?

后端 未结 4 1940
一个人的身影
一个人的身影 2020-12-15 08:41

I\'m curious to know how the Nullable type works behind the scenes. Is it creating a new object(objects can be assigned null) with a possible value of null?

In the

4条回答
  •  轮回少年
    2020-12-15 09:15

    Here is the (tidied up) code from running .Net Reflector against Nullable...

    [Serializable, StructLayout(LayoutKind.Sequential), TypeDependency("System.Collections.Generic.NullableComparer`1"), TypeDependency("System.Collections.Generic.NullableEqualityComparer`1")]
    public struct Nullable where T: struct
    {
    
    private bool hasValue;
    internal T value;
    
    public Nullable(T value)
    {
        this.value = value;
        this.hasValue = true;
    }
    
    public bool HasValue
    {
        get
        {
            return this.hasValue;
        }
    }
    
    public T Value
    {
        get
        {
            if (!this.HasValue)
            {
                ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
            }
            return this.value;
        }
    }
    
    public T GetValueOrDefault()
    {
        return this.value;
    }
    
    public T GetValueOrDefault(T defaultValue)
    {
        if (!this.HasValue)
        {
            return defaultValue;
        }
        return this.value;
    }
    
    public override bool Equals(object other)
    {
        if (!this.HasValue)
        {
            return (other == null);
        }
        if (other == null)
        {
            return false;
        }
        return this.value.Equals(other);
    }
    
    public override int GetHashCode()
    {
        if (!this.HasValue)
        {
            return 0;
        }
        return this.value.GetHashCode();
    }
    
    public override string ToString()
    {
        if (!this.HasValue)
        {
            return "";
        }
        return this.value.ToString();
    }
    
    public static implicit operator Nullable(T value)
    {
        return new Nullable(value);
    }
    
    public static explicit operator T(Nullable value)
    {
        return value.Value;
    }
    }
    

提交回复
热议问题