using System; public struct Ipv4Addr : IEquatable { private byte[] octets; // 构造函数 public Ipv4Addr(byte[] octets) { if (octets == null || octets.Length != 4) throw new ArgumentException("IPv4 address must have exactly 4 octets."); this.octets = octets; } // 允许访问 octets 数组 public byte[] Octets => octets; // 重写 Equals 方法 public override bool Equals(object obj) { return obj is Ipv4Addr other && Equals(other); } // 实现 IEquatable 接口 public bool Equals(Ipv4Addr other) { for (int i = 0; i < 4; i++) { if (this.octets[i] != other.octets[i]) return false; } return true; } // 重写 GetHashCode 方法 public override int GetHashCode() { int hash = 17; foreach (var octet in octets) { hash = hash * 31 + octet; } return hash; } // 提供一个用于显示的字符串格式 public override string ToString() { return string.Join(".", octets); } // 静态方法来解析字符串形式的 IPv4 地址 public static Ipv4Addr Parse(string ipString) { var parts = ipString.Split('.'); if (parts.Length != 4) throw new ArgumentException("Invalid IPv4 address format."); var octets = new byte[4]; for (int i = 0; i < 4; i++) { octets[i] = byte.Parse(parts[i]); } return new Ipv4Addr(octets); } // 重载 == 和 != 操作符 public static bool operator ==(Ipv4Addr left, Ipv4Addr right) { return left.Equals(right); } public static bool operator !=(Ipv4Addr left, Ipv4Addr right) { return !(left == right); } }