diff --git a/docs/fundamentals/code-analysis/quality-rules/ca2224.md b/docs/fundamentals/code-analysis/quality-rules/ca2224.md index 9cd7d59ce412b..28f3d5b073a99 100644 --- a/docs/fundamentals/code-analysis/quality-rules/ca2224.md +++ b/docs/fundamentals/code-analysis/quality-rules/ca2224.md @@ -9,6 +9,9 @@ f1_keywords: helpviewer_keywords: - "OverrideEqualsOnOverloadingOperatorEquals" - "CA2224" +dev_langs: +- CSharp +- VB --- # CA2224: Override Equals on overloading operator equals @@ -62,10 +65,14 @@ For more information, see [How to suppress code analysis warnings](../suppress-w The following example shows a class (reference type) that violates this rule. +:::code language="csharp" source="snippets/csharp/all-rules/ca2224.cs" id="snippet1"::: + :::code language="vb" source="snippets/vb/all-rules/ca2224.vb" id="1"::: The following example fixes the violation by overriding . +:::code language="csharp" source="snippets/csharp/all-rules/ca2224.cs" id="snippet2"::: + :::code language="vb" source="snippets/vb/all-rules/ca2224.vb" id="2"::: ## Related rules diff --git a/docs/fundamentals/code-analysis/quality-rules/snippets/csharp/all-rules/ca2224.cs b/docs/fundamentals/code-analysis/quality-rules/snippets/csharp/all-rules/ca2224.cs new file mode 100644 index 0000000000000..a01bfe2d2e92a --- /dev/null +++ b/docs/fundamentals/code-analysis/quality-rules/snippets/csharp/all-rules/ca2224.cs @@ -0,0 +1,87 @@ +using System; + +namespace ca2224 +{ + // + // This class violates the rule. + public class Point + { + public int X { get; set; } + public int Y { get; set; } + + public Point(int x, int y) + { + X = x; + Y = y; + } + + public override int GetHashCode() + { + return HashCode.Combine(X, Y); + } + + public static bool operator ==(Point pt1, Point pt2) + { + if (ReferenceEquals(pt1, null) || ReferenceEquals(pt2, null)) + return false; + + if (pt1.GetType() != pt2.GetType()) + return false; + + return pt1.X == pt2.X && pt1.Y == pt2.Y; + } + + public static bool operator !=(Point pt1, Point pt2) + { + return !(pt1 == pt2); + } + } + // +} + +namespace ca2224_2 +{ + // + // This class satisfies the rule. + public class Point + { + public int X { get; set; } + public int Y { get; set; } + + public Point(int x, int y) + { + X = x; + Y = y; + } + + public override int GetHashCode() + { + return HashCode.Combine(X, Y); + } + + public override bool Equals(object? obj) + { + if (obj is null) + return false; + + if (GetType() != obj.GetType()) + return false; + + Point pt = (Point)obj; + return X == pt.X && Y == pt.Y; + } + + public static bool operator ==(Point? pt1, Point? pt2) + { + // Object.Equals calls Point.Equals(Object). + return Equals(pt1, pt2); + } + + public static bool operator !=(Point? pt1, Point? pt2) + { + // Object.Equals calls Point.Equals(Object). + return !Equals(pt1, pt2); + } + } + // +}