隐藏 Equals 和 ReferenceEquals

5
我正在创建一个内部类,用于提供合同模式的构造。
using System;
using System.Runtime.Serialization;

namespace DCS2000.Common35.Core
{
  public class Assertion
  {
    public static void Ensure(bool test)
    {
        if (!test)
        {
            throw new PreconditionException("Precondition test failed");
        }
    }

    public static void Ensure(object obj)
    {
        if (obj == null)
        {
            throw new PreconditionException("Precondition null object failed");
        }
    }

    public static void Require(bool test)
    {
        if (!test)
        {
            throw new PostconditionException("Postcondition test failed");
        }
    }

    public static void Require(object obj)
    {
        if (obj == null)
        {
            throw new PostconditionException("Postcondition null object failed");
        }
    }
  }
}

当开发者使用它时,他们将在Intellisense中看到以下选项:

  • Ensure (确保)
  • Equals (相等)
  • ReferenceEquals (引用相等)
  • Require (需要)

这很令人困惑,我想知道是否有方法可以隐藏 Equals 和 ReferenceEquals。

注意:我已经尝试过这个,但对我没有用:

    [EditorBrowsable(EditorBrowsableState.Never)]
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
3个回答

4

使用:

    [EditorBrowsable(EditorBrowsableState.Never)]
    public override bool Equals(object obj)
    {
        throw new Exception("Assertion does not implement Equals, use Ensure or Require");
    }

    [EditorBrowsable(EditorBrowsableState.Never)]
    public new bool ReferenceEquals(object objA, object objB)
    {
        throw new Exception("Assertion does not implement ReferenceEquals, use Ensure or Require");
    }

如果开发人员设置了适当的VS设置,这将隐藏成员,并立即通知开发人员,在运行时,如果他们在代码库中不合适地使用Equals或ReferenceEquals,则应避免使用它。


这个非常好用!谢谢。我发现在我最常用的对象中查找未使用的方法非常有帮助,特别是如果它使用流畅接口。 - smdrager

4

补充Matti的回答,EditorBrowsableState.Never 取决于用户在选项下的 Visual Studio 设置,文本编辑器,C#,常规。

它只有在用户打开'隐藏高级成员'选项时才有效。Visual Studio 默认显示所有成员。


而使用此程序集的程序无法在解决方案中加载 - 您必须引用已编译的 DLL。 - smdrager

-2
说实话,我认为任何自称为.NET开发人员的人都应该习惯于在不需要时忽略这些方法。
如果你真的想要隐藏它们,并且它们都是可重写的(我忘记了ReferenceEquals是否可重写,因为我从未使用过),你可以将它们覆盖为private override
好吧,这行不通。现在我看了一下,private override没有意义,protected override也不太允许,而private newprotected new则会创建新的方法,而基类方法仍然可访问。我认为你根本无法用访问修饰符隐藏它们。
而且似乎整个问题都是关于静态方法的。唉,我真的失败了。

私有重写? 我敢肯定你不能更改覆盖上的保护级别。 - Kirk Woll
@Matti Equals是一个虚方法,不能是私有的。 - Lucas B
@Tim:private new并不会从接口中移除Equals方法。你仍然在调用对象的Equals方法。 - Stefan Steinegger
问题是关于Equals()的静态版本,所以关于重写的讨论是多余的。 - codymanix
@Matti,你应该在第一句话后停下来,那句话是完全正确的 :) - Rex M
@Rex:嗯,现在已经太晚了。在这么多评论之后删除会很无聊。 - Matti Virkkunen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接