如何将一个类标记为已废弃?

242

19
将早期问题标记为重复问题不是不恰当的举动吗? - noelicus
6
我们应该将第一个问题标记为过时/不推荐使用。因此,现在的问题是:如何标记一个问题为过时? - Matthieu Charbonnier
4个回答

431
你需要使用[Obsolete]属性。
示例:
[Obsolete("Not used any more", true)]
public class MyDeprecatedClass
{
    //...
}

这些参数是可选的。第一个参数是用来提供它过时的原因,最后一个参数则是在编译时抛出错误而不是警告。


2
这里的[Obsolete("Not used anymore",true)]存在两个主要缺陷:1. 如果代码不再使用,应将其删除;2. 该说明未提供替代方案或操作的信息。 - tymtam
6
你说得没错,但在抽出开发者脚下的地毯之前,你可能需要给他们一些时间来迁移他们的代码到你的新实现上。通常会将一个组件标记为过时的状态,持续1-2个版本。 - Michael Kargl
5
一个用例是:将其保留为默认值(false),在注释中提及“1或2个发布版本”。然后在适当的时候将其更改为true,这样仍在使用它的人现在会在他们的代码中收到错误并被迫进行更改。 [Obsolete("Will be deprecated December 12, 2018. Use xyz instead.")] 然后... [Obsolete("Method was deprecated December 12, 2018. Use xyz instead.", true)] 这样就很清楚了。然后在另一个日期完全删除它。 - DrCJones
3
@tymtam,立即删除公共API并不明智,因为其他人正在使用它,他们会感到困惑和惊讶。你应该只删除标记为过时的私有部分,或者仅在你是唯一开发人员或使用代码的情况下才删除代码。 - Guney Ozsan
这里用“明智”一词有些过于强烈了。Python改变了其print方法的语法;有时候破坏性的变化也是可以接受的(Microsoft的Azure库就是一个更为当前的例子)。如果类X不再被使用,我认为我希望我的代码在编译时出错,而不是假装一切正常。 - tymtam

51

根据Doak的回答,但如果你想要代码编译通过,属性的第二个参数应该设置为false:

[Obsolete("Not used any more", false)]
public class MyDeprecatedClass
{
        //...
}

这只会引发警告。


4
您也可以完全省略该属性(默认为 false):[Obsolete("Not used anymore")];个人认为不在末尾加布尔值更易读。 - Wolfgang

23
不删除类而弃用的原因是遵守某些“礼貌政策”,当您的代码是一个已经建立的 API,然后被第三方使用时。如果您选择弃用而非删除,您会给消费者一个生命周期策略(例如,类的维护和存在直至版本 X.X),以便让他们计划适当地迁移到您的新 API。

-9
如果您正在使用版本控制,我建议您直接删除该类。没有理由让未使用的代码留在那里。
如果您后来决定需要这个类,版本控制将是一个方便的撤销操作。

5
我猜他想将其标记为"已弃用",以便在删除代码库中所有对它的引用之前,代码仍然可以编译。 - shsteimer
18
我会尽力完成这份翻译工作,以下是翻译的内容:我需要逐步地完成它。我现在不能从项目中删除它。注释一个类或方法后,以后很难找到它……我不想忘记它。我认为弃用一个方法仍然有其存在的价值。 - Mister Dev
11
踩是生活的一部分。我不会对此心存不满。(但还是谢谢) - jjnguy
5
如果您正在开发一个公共 API,那么您不能选择删除已过时的方法或类。您通常需要给您的客户几个版本来解除他们对您代码的依赖。 - Michael Meadows
8
如果你有一个非常大的项目,你不能仅仅删除正在使用的类。你必须根据预算和时间的要求慢慢迁移代码。将一个类标记为过时可以鼓励新开发转向替换类。因此,删除并不总是有用的。使用 [Obsolete("请开始使用ReferenceListBusinessService", false)] 来抛出警告而不是错误。 - Rebecca
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接