通知开发人员“不要使用”方法

时间:2008-08-26 11:09:31

标签: .net attributes

好的,我知道你在想什么,“为什么写一个你不希望别人使用的方法?”正确?

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

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

所以,我需要拥有它,但我不希望人们使用它,所以是否有任何属性可用于将方法标记为“请勿使用“吗

我正在考虑使用 Obsolete 属性(因为这可以停止构建),但这看起来有点“错误”,还有其他方法可以做到这一点,还是我需要继续咬紧牙关? :)

更新

好吧,我接受了基思的回答,因为我想在心里,我完全同意。这就是我首先提出这个问题的原因,我不喜欢拥有过时属性的概念。

然而...

仍然是一个问题,而我们在intellisense中被通知,理想情况下,我们想打破构建,所以有什么方法可以做到这一点吗?也许创建一个自定义属性?

创建了更集中的问题here

13 个答案:

答案 0 :(得分:22)

您可以使用:

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

因此它不会出现在Intellisence中。如果消费者仍然想要使用它,他们可以,但它不会被发现。

Keiths关于过度工程的观点仍然存在。

答案 1 :(得分:14)

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

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

基本上你说XmlSerializer制作副本然后设置属性是可以的,但是你不想要自己的代码。

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

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

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

答案 2 :(得分:2)

我阅读标题并立即想到“过时的属性”。 <怎么样

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

答案 3 :(得分:2)

我实际上倾向于不同意所有提倡使用ObsoleteAttribute的人,因为MSDN文档说:

  

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

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

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

答案 4 :(得分:1)

您可以构建自己的Attribute派生类,比如NonCallableAttribute来限定方法,然后在构建/ CI代码分析任务中添加检查以监控是否有任何代码使用这些方法。< / p>

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

答案 5 :(得分:0)

ObsoleteAttribute可能适用于您的情况 - 如果使用该方法,您甚至可能导致构建中断。

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

答案 6 :(得分:0)

您正在寻找的是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() { }
}

答案 7 :(得分:0)

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

您还需要NHibernate的默认构造函数,但我想强迫人们不要使用C#3.0对象初始值设定项,以便类通过构造函数代码。

答案 8 :(得分:0)

throw new ISaidDoNotUseException();

答案 9 :(得分:0)

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

答案 10 :(得分:0)

已经有很多好的答案。 但是我认为最好的选择是使用可以使用参数化构造函数的序列化程序。 它不是您需要的序列化程序,但是例如,Entity Framework Core知道如何使用参数化的构造函数。

实体框架核心文档:

如果EF Core找到带有参数名称和 类型与映射属性的类型匹配,则它将调用 具有这些属性值的参数化构造函数,以及 不会明确设置每个属性。

答案 11 :(得分:-1)

是的,有。

我写了这篇关于它的博文Working with the designer

以下是代码:


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

答案 12 :(得分:-1)

我正在使用ObsoleteAttribute

但你当然也可以发表一些意见。

如果可以,最后将其彻底删除(不必保持与旧版本的兼容性)。那是最好的方式。