Hide Equals和ReferenceEquals

时间:2010-08-03 14:35:57

标签: c# visual-studio-2008 intellisense

我正在创建一个内部类来为Contract模式提供构造。

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中看到这些选项:

  • 确保
  • 等于
  • 的ReferenceEquals
  • 需要

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

注意:我已经尝试过这个,但它对我不起作用:

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

3 个答案:

答案 0 :(得分:4)

要添加到Matti的答案,EditorBrowsableState.Never取决于用户在选项,文本编辑器,C#,常规下的Visual Studio设置。

仅当用户启用了“隐藏高级成员”时才会生效。 Visual Studio默认显示所有成员。

答案 1 :(得分:3)

使用:

    [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。 / p>

答案 2 :(得分:-2)

老实说,我认为任何自称为.NET开发人员的人都应该习惯使用这些方法,并在不需要时忽略它们。

如果你真的想要隐藏它们,如果它们都是可以覆盖的(我忘记了ReferenceEquals是因为我从未使用它),你可以将它们覆盖为private override

好的,这不起作用。现在我看了它,private override没有意义,protected override也不被允许,private newprotected new创建新方法,而基类方法仍可访问。我认为你根本不能用访问修饰符来隐藏它们。

似乎整个事情都是关于静态方法的。哎呀,我真的失败了。