Сообщите разработчику метода "НЕ ИСПОЛЬЗУЙТЕ"
Хорошо, я знаю, о чем вы думаете, "зачем писать метод, который вы не хотите, чтобы люди использовали?" Правильно?
Ну, словом, у меня есть класс, который нужно сериализовать в XML. Чтобы XmlSerializer
выполнить свою магию, класс должен иметь пустой конструктор по умолчанию:
public class MyClass
{
public MyClass()
{
// required for xml serialization
}
}
Итак, мне нужно иметь его, но я не хочу, чтобы люди его использовали, поэтому есть ли какой-либо атрибут, который можно использовать для обозначения метода как "НЕ ИСПОЛЬЗОВАТЬ"?
Я думал об использовании атрибута Obsolete (поскольку это может остановить сборку), но это просто кажется "неправильным", есть ли другой способ сделать это, или мне нужно идти вперед и укусить пулю?:)
Update
Хорошо, я принял ответ Кейта, так как, полагаю, в глубине души я полностью согласен. Вот почему я задал вопрос в первую очередь, мне не нравится понятие атрибута Obsolete.
Однако...
По-прежнему существует проблема, в то время как мы уведомляемся в intellisense, в идеале, мы хотели бы разбить сборку, так есть ли способ сделать это? Возможно создать пользовательский атрибут?
Более целенаправленный вопрос был создан здесь.
Ответы
Ответ 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();