.NET基础 (11)类型的基类System.Object
类型的基类System.Object
1 是否存在不继承自System.Object类型的类
2 在System.Object中定义的三个比较方法有何异同
3 如何重写GetHashCode方法
类型的基类System.Object
1 是否存在不继承自System.Object类型的类
通过运行ILasm.exe的noautoinherit开关,可以生产不从System.Object继承的类型,这种类型是不安全的类型,也不建议使用。
2 在System.Object中定义的三个比较方法有何异同
静态方法ReferenceEquals实现了引用比较。
静态Equals方法实现了比较高效地调用实例Equals方法的功能。
实例Equals方法是一个虚方法,默认实现的是引用比较,类型可以根据需要重写Equals方法。值类型的基类ValueType重写了Equals方法,实现了内容比较。
Object中GetHasCode的算法保证了同一对象返回同一HashCode,而不同的对象返回不同的HashCode,但对于值类型等视内容相等的对象为相等对象的类型时,默认的GetHashCode算法并不正确。重写后的GetHashCode必须要保证同一对象无论何时都返回同一HashCode值,而相等的对象也必须返回相同的值。并且在此基础上,保证HashCode尽量随机地散列分布。
示例:
sealed class OverrideGetHashCode { public int _MyInt; //只读成员 public readonly String _MyString; //重写了Equals方法 public override bool Equals(object obj) { // 检查空引用 if (obj == null) return false; //做引用比较,如果两者引用相等,势必内容相等 if (Object.ReferenceEquals(this, obj)) return true; if (this.GetType() != obj.GetType()) return false; // 实现内容比较 OverrideGetHashCode right = obj as OverrideGetHashCode; if (_MyInt == right._MyInt && _MyString == right._MyString) return true; return false; } public OverrideGetHashCode(int i, String s) { _MyInt = i; _MyString = s; } //重写了 GetHashCode方法 public override int GetHashCode() { //依靠只读成员的HashCode return _MyString.GetHashCode(); } static void Main(string[] args) { //验证相等的对象返回相等的HashCode OverrideGetHashCode o1 = new OverrideGetHashCode(10, "我是字符串"); OverrideGetHashCode o2 = new OverrideGetHashCode(10, "我是字符串"); Console.WriteLine("对象是否相等:" +o1.Equals(o2)); Console.WriteLine("相等对象HashCode是否相等" + (o1.GetHashCode() == o2.GetHashCode()).ToString()); //验证同一对象返回相等的HashCode int code = o1.GetHashCode(); o1._MyInt = 12; Console.WriteLine("同一对象HashCode是否相等:" + (o1.GetHashCode() == code).ToString()); Console.Read(); } }
输出:
对象是否相等:True
相等对象HashCode是否相等True
同一对象HashCode是否相等:True
转载请注明出处: