Сведения о вопросе

Ayrat

00:38, 22nd August, 2020

Теги

.net   attributes    

Уведомить разработчика о методе "DO NOT USE"

Просмотров: 427   Ответов: 12

Ладно, я знаю, о чем ты думаешь, верно?

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

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

Итак, мне нужно иметь его, но я не хочу, чтобы люди его использовали , поэтому есть ли какой-либо атрибут, который можно использовать для обозначения метода как "не использовать"?

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

Обновление

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

Однако...

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

Здесь был создан более сфокусированный вопрос .



  Сведения об ответе

Chhiki

04:00, 24th August, 2020

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

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

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

Однако точка зрения Китса о сверхинженерии все еще стоит.


  Сведения об ответе

dump

06:59, 26th August, 2020

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

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

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

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

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

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


  Сведения об ответе

padenie

22:28, 14th August, 2020

Я прочел заголовок и сразу подумал: "28. Как насчёт

    /// <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) { 
    ....


  Сведения об ответе

dumai

12:34, 23rd August, 2020

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

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

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

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


  Сведения об ответе

#hash

23:54, 11th August, 2020

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

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


  Сведения об ответе

park

08:55, 17th August, 2020

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

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


  Сведения об ответе

SKY

00:27, 17th August, 2020

То, что вы ищете-это класс 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() { }
}


  Сведения об ответе

dumai

18:09, 4th August, 2020

Ух ты, эта проблема меня тоже достает.

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


  Сведения об ответе

ЯЯ__4

12:34, 13th August, 2020

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


  Сведения об ответе

ЯЯ__4

12:15, 4th August, 2020

throw new ISaidDoNotUseException();


  Сведения об ответе

padenie

18:57, 24th August, 2020

Да, это так.

Я написал об этом в своем блоге, работая с дизайнером .

А вот и код:


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


  Сведения об ответе

appple

07:48, 2nd August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться