Уведомить Разработчика о Методе “НЕ ИСПОЛЬЗОВАТЬ”

StackOverflow https://stackoverflow.com/questions/27758

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Обновить

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

Однако...

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

[Система.Компонентмодель.Редактируемый браузер(System.ComponentModel.EditorBrowsableState.Никогда)]

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

Тем не менее, точка зрения Китса о чрезмерной инженерии все еще остается в силе.

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

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

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

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

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

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

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

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

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

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

throw new ISaidDoNotUseException();

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

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

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

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

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

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

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

Да, есть.

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

И вот этот код:


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top