如何将代码标记为"不用于将来使用"

Cha*_*ion 11 c# obsolete visual-studio

我经常遇到一种情况,我想阻止其他开发人员继续使用方法或类.例如,假设我有两个库方法"A"和"B",其中"A"是执行某项任务的"旧"方式,"B"是执行该任务的"新"方式.在许多情况下,A和B完全不同,使用A来重构代码开始使用B非平凡(例如需要流过附加状态).由于A适用于使用它的情况,我不想优先考虑重构.但是,我确实希望给我的开发人员一个直观的指示,即A不会在新代码中使用.

因此,我理想地喜欢在引用具有ObsoleteAttributeWITHOUT相关编译器警告/错误的成员时获得的删除(因为启用它会从A的所有旧用途中发出数百个错误,我们不打算随时解决).这样,如果开发人员用A编写新的代码行,他或她将立即注意到删除并修复代码以使用B.

有没有办法在VisualStudio(2012)中获得此类功能?

编辑:

  • 对"无法区分新旧代码"的效果有几点评论.我同意.但是,这不是我要求的,所以让我澄清一下:相反,我想要的是代码"过时"(例如删除线)的直观表示,没有相应的编译器警告或错误.这样,开发人员在阅读旧代码或编写新代码的过程中,会立即看到某些内容已过时.即使.NET本身不支持这种情况,也许为此目的有一个VS扩展吗?

  • 对于"你不能既有警告也没有警告"的效果,有几条评论.我以为我解释了上面的用例,但我会再试一次.我们有一组核心库,在构成我们代码库的各种解决方案中大量使用.有时,我会对其中一个库进行更新,这些库提供了一个新的,更好的API来执行某些任务.为了保持向后兼容性,我不能只删除执行该任务的旧方法(在许多情况下),因为大量现有代码依赖于使用旧的API集,并且不能轻易地重构以使用新的API.此外,没有迫切的理由这样做; 它只会冒险将bug引入现有代码.但是,我想通过某种方式在视觉上提醒开发人员注意某些API应该避免使用其他API.这很困难,因为开发人员倾向于通过阅读完成相同任务的现有代码来学习如何完成某项任务.这使得新的API难以传播,因为旧的根深蒂固的API被如此多的现有代码引用.在ObsoleteAttribute通过编译器警告实现这一点,但这些警告将刚刚从数百旧的API的现有用途的创建吨的噪音.这就是我喜欢删除线的原因:它是非常直观的,但只有在开发人员阅读或编写使用过时API的代码时才会干扰开发人员.以下是我想标记旧API的一些更改示例:

    • 我们引入了一个用于运行SQL查询的新API,它比以前更简洁,更古怪,更灵活.很难彻底删除旧的API,因为它有许多可能依赖的古怪行为.但是,我想将人们推向新API以便将来开发.
    • 我们有两套内部单元测试助手API.较旧的功能完全正常,但它依赖于继承并且不是很灵活.较新的一个使用属性构建,更灵活.数百个旧测试仍然使用旧API运行,但我想推动新测试的编写者使用新API.
    • 我们的核心库有一些旧的随机遗留代码,它们并不适合,但此时很难删除.我想减少添加对这些类型和方法的新引用.这样,在某些时候删除它们可能会降低成本效率,因为依赖于它们的现有代码会因正常的流失而消失.
  • 作为进一步的说明,我认为这个问题的答案很好地描述了为什么你可能不会标记过时的东西,即使你不建议在新代码中使用它.

  • 有几条评论/答案只是简单地说出了存在ObsoleteAttribute.请注意,此问题的文本始终引用该属性.

paq*_*mez 10

Obsolete属性添加到您的方法将在intellisense中提供删除线.

[ObsoleteAttribute("This property is obsolete. Use NewProperty instead.", false)] 
public static string OldProperty
{ get { return "The old property value."; } }
Run Code Online (Sandbox Code Playgroud)

要禁用警告,请在属性前添加:

#pragma warning disable 612, 618
Run Code Online (Sandbox Code Playgroud)

并重新启用:

#pragma warning restore 612, 618
Run Code Online (Sandbox Code Playgroud)

如前所述这里,把你的项目文件,而不是在你的代码中忽略将是一个非常干净的解决方案.

<WarningsNotAsErrors>618</WarningsNotAsErrors>
Run Code Online (Sandbox Code Playgroud)

编辑:另外,查看@ JonHanna关于使用该EditorBrowsable属性的答案.

正如其他人所指出的,实际上有2个警告与过时属性一起抛出.

编辑:

#pragma warning disable 612, 618
[Obsolete]
#pragma warning restore 612, 618
public class test1
{...
Run Code Online (Sandbox Code Playgroud)

当你尝试使用时,test1你会得到:

在此输入图像描述

请注意,当您键入var test = new test1()删除线时不会发生.

但是test1 test = new test1()会显示删除线.


Jon*_*nna 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
Run Code Online (Sandbox Code Playgroud)

当然,如果有充分的理由停止使用它,那么有充分的理由尽快进行审核,而不是稍后进行.

编辑:哎呀,我忘了612以及618.你可以设置属性提高619而不是618,但不能禁用(设置它的主要原因之一,有时适合).

进一步的沮丧可能来自标记成员[EditorBrowsable(EditorBrowsableState.Never)].事实上,这个方法根本不会出现在intellisense中,而新的方法会鼓励人们使用新的方法(只要库被引用为库而不是解决方案中的项目,或者在同一个项目中的类).


Ed *_* S. 6

使用ObsoleteAttribute.

[ObsoleteAttribute("This method is obsolete. Call NewMethod instead.", false)] 
public string SomeObsoleteMethod()
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

IsError如果设置为true,则最后一个参数()将发出编译错误,否则将发出警告.您可以使用禁用警告#pragma 612, 618

编辑:

好的,很好,我松了一口气.您想要的解决方案似乎是:

/// <summary>
/// Please don't use
/// </summary>
public string SomeObsoleteMethod()
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

根本没有编译器支持.

  • @Magus:是的......在没有发出警告的情况下将某些东西标记为已弃用(过时)只是有点愚蠢...... (4认同)
  • @EdS:为什么在你的项目中防止数百个不必要的警告是愚蠢的? (3认同)
  • @EdS.:但他已经提到:_"因为打开它会从A的所有旧用途中发出数百个错误,我们不打算很快解决这个问题"_.Imho,这是明确和合理的. (2认同)

归档时间:

查看次数:

2392 次

最近记录:

11 年,7 月 前