public abstract class AbstractBaseClass
public abstract string SomeUniqueProperty { get; }
protected bool Equals(AbstractBaseClass other)
return Equals(this.SomeUniqueProperty, other.SomeUniqueProperty);
public override bool Equals(object obj)
if (ReferenceEquals(null, obj))
if (ReferenceEquals(this, obj))
return obj.GetType() == this.GetType() && this.Equals((AbstractBaseClass)obj);
public override int GetHashCode()
return (this.SomeUniqueProperty != null ? this.SomeUniqueProperty.GetHashCode() : 0);
public static bool operator ==(AbstractBaseClass a, AbstractBaseClass b)
var isANull = ReferenceEquals(null, a);
var isBNull = ReferenceEquals(null, b);
return (isANull && isBNull) || a?.Equals(b) ?? false;
public static bool operator !=(AbstractBaseClass a, AbstractBaseClass b)
public class ChildClass1 : AbstractBaseClass
public override string SomeUniqueProperty
public class ChildClass2 : AbstractBaseClass
public override string SomeUniqueProperty
public static void Main()
AbstractBaseClass baseClass = null;
Console.WriteLine("Null check succeeded...");
Console.WriteLine("Null check failed...");