Подтвердить что ты не робот

Сообщите разработчику метода "НЕ ИСПОЛЬЗУЙТЕ"

Хорошо, я знаю, о чем вы думаете, "зачем писать метод, который вы не хотите, чтобы люди использовали?" Правильно?

Ну, словом, у меня есть класс, который нужно сериализовать в XML. Чтобы XmlSerializer выполнить свою магию, класс должен иметь пустой конструктор по умолчанию:

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

Итак, мне нужно иметь его, но я не хочу, чтобы люди его использовали, поэтому есть ли какой-либо атрибут, который можно использовать для обозначения метода как "НЕ ИСПОЛЬЗОВАТЬ"?

Я думал об использовании атрибута Obsolete (поскольку это может остановить сборку), но это просто кажется "неправильным", есть ли другой способ сделать это, или мне нужно идти вперед и укусить пулю?:)

Update

Хорошо, я принял ответ Кейта, так как, полагаю, в глубине души я полностью согласен. Вот почему я задал вопрос в первую очередь, мне не нравится понятие атрибута Obsolete.

Однако...

По-прежнему существует проблема, в то время как мы уведомляемся в intellisense, в идеале, мы хотели бы разбить сборку, так есть ли способ сделать это? Возможно создать пользовательский атрибут?

Более целенаправленный вопрос был создан здесь.

4b9b3361

Ответ 1

Если класс [Serialisable] (т.е. он может быть скопирован вокруг места по мере необходимости) конструктор param-less необходим для десериализации.

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

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

В какой-то степени я думаю, что это чрезмерное проектирование.

Просто добавьте комментарии XML, в которых подробно описаны свойства, необходимые для инициализации (и что).

Не используйте [Obsolete], потому что это не так. Зарезервируйте это для действительно устаревших методов.

Ответ 2

Вы можете использовать:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

чтобы он не отображался в Intellisence. Если потребитель все еще хочет использовать его, он может, но он не будет таким доступным.

Keiths указывает, что над инженерией все еще стоит.

Ответ 3

Я прочитал заголовок и сразу подумал "устаревший атрибут". Как насчет

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....

Ответ 4

На самом деле я был бы склонен не соглашаться со всеми, кто выступает за использование ObsoleteAttribute, поскольку в документации MSDN говорится:

Маркировка элемента как устаревшего информирует пользователей о том, что элемент будет удален в будущих версиях продукта.

Поскольку универсальные конструкторы для сериализации XML не должны удаляться из приложения, я бы не применял его на всякий случай, если разработчик по обслуживанию не знает, как работает сериализация XML.

Я действительно использовал метод Keith, просто отметив, что конструктор используется для сериализации в документации XML, чтобы он отображался в Intellisense.

Ответ 5

Вы можете создать собственный Attribute производный класс, скажем NonCallableAttribute, чтобы квалифицировать методы, а затем добавить в свою сборку /CI для проверки кода, если какой-либо код использует эти методы.

На мой взгляд, вы действительно не можете заставить разработчиков не использовать этот метод, но вы можете обнаружить, когда кто-то нарушил правило как можно скорее и исправит его.

Ответ 6

ObsoleteAttribute, вероятно, будет работать в вашей ситуации - вы даже можете заставить сборку сломаться, если этот метод используется.

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

Ответ 7

Что вы ищете, это ObsoleteAttribute класс:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

Ответ 8

Ничего себе, эта проблема тоже меня раздражает.

Вам также нужны конструкторы по умолчанию для NHibernate, но я хочу заставить людей НЕ использовать инициализаторы объектов С# 3.0, чтобы классы проходили через код конструктора.

Ответ 9

Отделите свой сериализуемый объект от объекта домена.

Ответ 10

Да, есть.

Я написал этот blogpost об этом Работа с дизайнером.

И вот код:


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

Ответ 11

Я использую ObsoleteAttribute.

Но вы также можете получить некоторые комментарии, конечно.

И, наконец, удалите его полностью, если сможете (не нужно поддерживать совместимость со старым). Это лучший способ.

Ответ 12

throw new ISaidDoNotUseException();