代码之家  ›  专栏  ›  技术社区  ›  Rob Cooper

通知开发人员“请勿使用”方法

  •  34
  • Rob Cooper  · 技术社区  · 17 年前

    好吧,我知道你在想什么,“为什么要写一个你不想让人们使用的方法?”对吧?

    简而言之,我有一个需要序列化为XML的类。为了 XmlSerializer 要发挥它的魔力,类必须有一个默认的空构造函数:

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

    所以,我需要它,但我不想让人们 使用 所以 是否有任何属性可用于将该方法标记为“不使用”?

    我在考虑使用 过时的 属性(因为这可以停止构建),但这似乎有点“错误”,还有其他方法可以做到这一点吗,还是我需要继续努力? :)

    更新

    好的,我已经接受了基思的回答,因为我心里想,我完全同意。这就是为什么我首先问这个问题,我不喜欢有 过时的 属性。

    然而。..

    那里 这仍然是一个问题,当我们在智能感知中收到通知时,理想情况下,我们想破坏构建,那么有什么方法可以做到这一点吗?也许创建一个自定义属性?

    已创建更集中的问题 here .

    14 回复  |  直到 5 年前
        1
  •  14
  •   willeM_ Van Onsem    10 年前

    VS2013之前 您可以使用:

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

    这样它就不会出现在IntelliSense中。如果消费者仍然想使用它,他们可以,但它不会那么容易被发现。

    Keith's point 不过,过度工程仍然存在。


    自VS2013以来 此功能已被删除。如所述 https://github.com/dotnet/roslyn/issues/37478 这是“故意的”,显然不会再回来了。

        2
  •  22
  •   willeM_ Van Onsem    10 年前

    如果一个类是 [Serialisable] (即,可以根据需要在该位置进行复制)需要无参数构造函数进行反序列化。

    我猜你想强制代码访问,将属性的默认值传递给参数化构造函数。

    基本上你是说这对 XmlSerializer 创建一个副本,然后设置属性,但您不希望自己的代码这样做。

    在某种程度上,我认为这是过度设计。

    只需添加XML注释,详细说明需要初始化哪些属性(以及需要初始化什么)。

    不使用 [Obsolete] ,因为它不是。将其保留给真正弃用的方法。

        3
  •  2
  •   hometoast    17 年前
    throw new ISaidDoNotUseException();
    
        4
  •  2
  •   Community Mohan Dere    8 年前

    你可以建立自己的 Attribute 派生类,比如 NonCallableAttribute 以限定方法,然后将检查添加到构建/CI代码分析任务中,以监视是否有任何代码正在使用这些方法。

    在我看来,你真的不能强迫开发人员不使用这种方法,但你可以尽快发现有人违反了规则并加以修复。

        5
  •  1
  •   willeM_ Van Onsem    10 年前

    实际上,我倾向于不同意所有主张使用 ObsoleteAttribute 正如MSDN文档所说:

    将元素标记为过时会通知用户该元素将在产品的未来版本中删除。

    由于XML序列化的通用构造函数不应从应用程序中删除,因此我不会应用它,以防未来的维护开发人员不熟悉XML序列化的工作原理。

    我实际上一直在使用 Keith's 只需注意构造函数用于XML文档中的序列化,以便它显示在Intellisense中。

        6
  •  0
  •   Jon Limjap    17 年前

    现在你可以使用 代码分析器 为了满足这样的需求,这要归功于现代的Roslyn编译器。网。

    您可以编写自己的代码分析器。以下是一些建议:

    或者使用一些已经存在的——这是我根据自己的需求选择的方式:

    这是Roslyn Analyzers的另一个不错的“主页”: Cybermaxs/出色的分析器:精心策划的列表。NET编译器平台(“Roslyn”)诊断分析器和代码修复。每个人都可以在这里做出贡献! https://github.com/Cybermaxs/awesome-analyzers

        7
  •  0
  •   FlySwat    17 年前

    我读了标题,立刻想到“过时的属性”。怎么样

        /// <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) { 
        ....
    
        8
  •  0
  •   user1010    17 年前

    将可序列化对象与域对象分离。

        9
  •  0
  •   willeM_ Van Onsem    10 年前

    哇,这个问题也困扰着我。

    您还需要NHibernate的默认构造函数,但我想强制人们不要使用C#3.0对象初始化器,这样类才能通过构造函数代码。

        10
  •  0
  •   willeM_ Van Onsem    10 年前

    你要找的是 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() { }
    }
    
        11
  •  -1
  •   willeM_ Van Onsem    10 年前

    ObsoleteAttribute 可能会在你的情况下奏效——如果使用这种方法,你甚至可以导致构建中断。

    由于过时的警告发生在编译时,并且序列化所需的反射发生在运行时,因此标记该方法过时不会破坏序列化,但会警告开发人员该方法不可用。

        12
  •  -1
  •   willeM_ Van Onsem    10 年前

    我在用 ObsoleteAttribute .

    当然,你也可以发表一些评论。

    最后,如果可以的话,完全删除它(不必保持与旧东西的兼容性)。这是最好的办法。

    推荐文章