我经常会遇到这样的情况:我不鼓励其他开发人员继续使用方法或类。例如,假设我有两个库方法“A”和“B”,其中“A”是执行某项任务的“旧”方式,“B”是执行该任务的“新”方式。在许多情况下,A和B完全不同,使用A来重构代码以开始使用B非平凡(例如,需要流过附加状态)。由于A适用于使用它的情况,我不想优先考虑重构。但是,我确实希望给我的开发人员一个直观的指示,即A不会在新代码中使用。
因此,我理想地喜欢在引用具有ObsoleteAttribute
的成员而没有相关编译器警告/错误的情况下获得的删除(因为启用它会从所有旧的用途中发出数百个错误)我们不打算很快解决的问题)。这样,如果开发人员使用A编写新的代码行,他或她将立即注意到删除并修复代码以使用B.
有没有办法在VisualStudio(2012)中获得此类功能?
编辑:
对于“无法区分新旧代码”的效果,有几条评论。我同意。但是,这不是我要求的,所以让我澄清一下:相反,我想要的是代码的“过时”(例如strikethrough)的直观表示,没有相应的编译器警告或错误。这样,开发人员在阅读旧代码或编写新代码的过程中,会立即看到某些内容已过时。即使在.NET中本身不支持这种情况,也许有一个VS扩展用于此目的吗?
对于“你不能同时发出警告而没有警告”的效果有几点评论。我以为我解释了上面的用例,但我会再试一次。我们有一组核心库,在构成我们代码库的各种解决方案中大量使用。有时,我会对其中一个库进行更新,这些库提供了一个新的,更好的API来执行某些任务。为了保持向后兼容性,我不能只删除执行该任务的旧方法(在许多情况下),因为大量现有代码依赖于使用旧的API集,并且不能轻易地重构以使用新的API。此外,没有迫切的理由这样做;它只会冒险将bug引入现有代码。但是,我想通过某种方式在视觉上提醒开发人员注意某些API应该避免使用其他API。这很困难,因为开发人员倾向于通过阅读完成相同任务的现有代码来学习如何完成某项任务。这使得新的API难以传播,因为旧的根深蒂固的API被如此多的现有代码引用。 ObsoleteAttribute
通过编译器警告实现了这一点,但这些警告只会从旧API的数百个现有用途中产生大量噪音。这就是我喜欢删除线的原因:它是非常直观的,但只有在开发人员阅读或编写使用过时API的代码时才会干扰开发人员。以下是我想标记旧API的一些更改示例:
作为进一步说明,我认为this question的答案很好地描述了为什么即使你不建议在新代码中使用它也不会标记过时的东西。
有几条评论/答案只是简单地提到了ObsoleteAttribute
的存在。请注意,此问题的文本始终引用该属性。
答案 0 :(得分:10)
在您的方法中添加Obsolete属性将在intellisense中提供删除线。
[ObsoleteAttribute("This property is obsolete. Use NewProperty instead.", false)]
public static string OldProperty
{ get { return "The old property value."; } }
要禁用警告,请在属性前添加:
#pragma warning disable 612, 618
重新启用:
#pragma warning restore 612, 618
如前所述here,在项目文件中而不是代码中放置一个忽略将是一个非常干净的解决方案。
<WarningsNotAsErrors>618</WarningsNotAsErrors>
编辑:另外,请查看@ JonHanna关于使用EditorBrowsable
attribute的答案。
正如其他人所指出的,实际上有2个警告与过时属性一起抛出。
编辑:
#pragma warning disable 612, 618
[Obsolete]
#pragma warning restore 612, 618
public class test1
{...
当您尝试使用test1
时,您将获得:
请注意,当您键入var test = new test1()
时,不会发生删除线。
但是test1 test = new test1()
会显示删除线。
答案 1 :(得分:8)
所以你想要一个警告,但没有任何警告?
这里的主要问题是,编译时没有什么可以区分“旧代码,在我们认为更好之前”来自“新代码,不应该使用旧习惯”;这只是代码。
关于您唯一能做的就是使用ObsoleteAttribute
,然后对当前用途使用#pragma warning disable 612, 618
。与往常一样,如果没有评论,#pragma warning
永远不会存在:
#pragma warning 612, 618 //This block of code uses BadOldMethod(), code review planned
/* ... code here */
#pragma warning restore 612, 618
当然,如果有充分的理由停止使用它,那么就有充分的理由尽快而不是稍后进行审核。
编辑:哎呀,我忘了612以及618.你可以设置属性提高619而不是618,但是不能禁用(设置它的主要原因之一是,有时候适合)。
将成员标记为[EditorBrowsable(EditorBrowsableState.Never)]
可能会产生进一步的挫折。事实上,这个方法根本不会出现在intellisense中,而新的方法会鼓励人们使用新的方法(只要库被引用为库而不是解决方案中的项目,或者同一个项目中的课程。)
答案 2 :(得分:6)
[ObsoleteAttribute("This method is obsolete. Call NewMethod instead.", false)]
public string SomeObsoleteMethod()
{
// ...
}
如果设置为IsError
,则最后一个参数(true
)将发出编译错误,否则将发出警告。您可以使用#pragma 612, 618
编辑:
好的,好的,我松了一口气。您想要的解决方案似乎是:
/// <summary>
/// Please don't use
/// </summary>
public string SomeObsoleteMethod()
{
// ...
}
根本没有编译器支持。
答案 3 :(得分:3)
我个人认为您应该使用ObsoleteAttribute
,确保使用#pragma
(请参阅here示例)在现有代码中根据需要禁用它。
及时修复代码。