SasIPRange
Represents a range of allowed IP addresses for constructing a Shared
            Access Signature.
            
                using System;
using System.ComponentModel;
using System.Net;
namespace Azure.Storage.Sas
{
    public readonly struct SasIPRange : IEquatable<SasIPRange>
    {
        public IPAddress Start { get; }
        public IPAddress End { get; }
        public SasIPRange(IPAddress start, IPAddress end = null)
        {
            Start = (start ?? IPAddress.None);
            End = (end ?? IPAddress.None);
        }
        private static bool IsEmpty(IPAddress address)
        {
            if (address != null)
                return address == IPAddress.None;
            return true;
        }
        public override string ToString()
        {
            if (!IsEmpty(Start)) {
                if (!IsEmpty(End))
                    return Start.ToString() + "-" + End.ToString();
                return Start.ToString();
            }
            return string.Empty;
        }
        public static SasIPRange Parse(string s)
        {
            int num = s.IndexOf('-');
            if (num != -1)
                return new SasIPRange(IPAddress.Parse(s.Substring(0, num)), IPAddress.Parse(s.Substring(num + 1)));
            return new SasIPRange(IPAddress.Parse(s), null);
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override bool Equals(object obj)
        {
            if (obj is SasIPRange) {
                SasIPRange other = (SasIPRange)obj;
                return Equals(other);
            }
            return false;
        }
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override int GetHashCode()
        {
            return (Start?.GetHashCode() ?? 0) ^ (End?.GetHashCode() ?? 0);
        }
        public static bool operator ==(SasIPRange left, SasIPRange right)
        {
            return left.Equals(right);
        }
        public static bool operator !=(SasIPRange left, SasIPRange right)
        {
            return !(left == right);
        }
        public bool Equals(SasIPRange other)
        {
            if ((IsEmpty(Start) && IsEmpty(other.Start)) || (Start != null && Start.Equals(other.Start))) {
                if (!IsEmpty(End) || !IsEmpty(other.End)) {
                    if (End != null)
                        return End.Equals(other.End);
                    return false;
                }
                return true;
            }
            return false;
        }
    }
}