Скрыть Равные и ReferenceEquals - PullRequest
       34

Скрыть Равные и ReferenceEquals

4 голосов
/ 03 августа 2010

Я создаю внутренний класс, чтобы обеспечить конструкцию для шаблона Контракта.

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 ]

4 голосов
/ 03 августа 2010

Чтобы добавить к ответу Матти, EditorBrowsableState.Never зависит от настроек Visual Studio пользователя в меню «Параметры», «Текстовый редактор», «C #», «Общие».

Оно вступает в силу только в том случае, если у пользователя включена функция «Скрыть расширенных членов».,Visual Studio по умолчанию показывает всех участников.

3 голосов
/ 03 августа 2010

Использование:

    [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, если они непреднамеренно используют его в базе кода. 1004 *

0 голосов
/ 03 августа 2010

Честно говоря, я думаю, что любой, кто называет себя разработчиком .NET, должен привыкнуть к тому, что эти методы существуют и игнорируют их, когда они не нужны.

Если вы действительно хотите скрыть их, и если они оба могут быть перезаписаны (я забыл, если ReferenceEquals, потому что я никогда не использовал его), вы можете переопределить их как private override.

Хорошо, это не работает. Теперь, когда я посмотрел на это, private override не имеет смысла, protected override тоже не совсем разрешено, а private new и protected new создают новые методы, пока метод базового класса все еще доступен. Я не думаю, что вы вообще можете скрыть их с помощью модификаторов доступа.

И, похоже, всё дело было в статических методах. Ну и дела, я действительно потерпел неудачу в этом.

...