草庐IT

c# - 如何将代码标记为 "not for future use"

coder 2024-05-29 原文

我经常遇到这样的情况,我想劝阻其他开发人员不要继续使用某个方法或类。例如,假设我有两个库方法“A”和“B”,其中“A”是执行某些任务的“旧”方式,而“B”是执行该任务的"new"方式。在许多情况下,A 和 B 有足够的不同,使得使用 A 开始使用 B 的重构代码非常重要(例如,需要流过额外的状态)。由于 A 在使用它的情况下有效,我不想优先考虑重构。但是,我确实想给我的开发人员一个直观的指示,表明 A 不会在新代码中使用。

因此,我希望您在使用 ObsoleteAttribute 引用成员时得到删除线。没有相关的编译器警告/错误(因为打开它会从 A 的所有旧用法中发出数百个错误,我们不打算很快解决这些错误)。这样,如果开发人员使用 A 编写新代码行,他或她会立即注意到删除线并修复代码以使用 B。

有没有办法在 VisualStudio (2012) 中获得这样的功能?

编辑:

  • 关于“无法区分新旧代码”的影响,有几条评论。我同意。但是,这不是我要的,所以让我澄清一下:相反,我想要的是代码“过时”(例如删除线)的视觉表示,没有相应的编译器警告或错误。这样,在阅读旧代码或编写新代码的过程中,开发人员将立即获得一些过时的视觉指示。即使这在 .NET 中不受 native 支持,也许有一个用于此目的的 VS 扩展?
  • “你不能同时有警告和没有警告”的效果有几条评论。我以为我解释了上面的用例,但我会再试一次。我们有一组核心库,它们在构成我们代码库的各种解决方案中大量使用。有时,我会更新这些库中的一个,它提供了一个新的、更好的 API 来执行某些任务。为了保持向后兼容性,我不能只删除执行该任务的旧方法(在许多情况下),因为大量现有代码依赖于使用旧的 API 集,并且不能简单地重构以使用新的 API。此外,没有紧迫的理由这样做。它只会冒着将错误引入现有代码的风险。但是,我希望以某种方式向开发人员发出视觉警告,即应避免使用某些 API 以支持其他 API。这很困难,因为开发人员倾向于通过阅读完成相同任务的现有代码来学习如何完成某些任务。这使得新的 API 难以传播,因为旧的根深蒂固的 API 被大量现有代码引用。 ObsoleteAttribute通过编译器警告实现这一点,但这些警告只会从旧 API 的数百种现有用途中产生大量噪音。这就是我喜欢删除线的原因:它非常直观,但只有在开发人员阅读或编写使用过时 API 的代码时,它才会打扰到开发人员。以下是我想标记旧 API 的一些更改示例:
  • 我们引入了一个新的 API 来运行 SQL 查询,它比我们以前的更简洁、更古怪且更灵活。很难彻底删除旧的 API,因为它有很多可能依赖的古怪行为。但是,我想插入人们使用新的 API 以进行 future 的开发。
  • 我们有两套内部单元测试助手 API。旧的功能完善,但它依赖于继承,不是很灵活。较新的一种是使用属性构建的,并且更加灵活。数百个旧测试仍在使用旧 API 运行,但我想插入新测试的编写者使用新 API。
  • 我们的核心库有一些旧的随机遗留代码,它们并不真正适合,但此时很难删除。我想减少对这些类型和方法的新引用的添加。这样,在某些时候删除它们可能会变得具有成本效益,因为依赖于它们的现有代码由于正常流失而消失。
  • 进一步说明,我认为答案是 this question很好地描述了为什么即使您不建议在新代码中使用它,也可能不将其标记为过时。
  • 有几个评论/答案只是指出 ObsoleteAttribute 的存在。 .请注意,此问题的文本始终引用该属性。
  • 最佳答案

    添加 Obsolete您的方法的属性将在智能感知中添加删除线。

    [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 ,在您的项目文件中而不是在您的代码中放置一个 ignore 将是一个非常干净的解决方案。
    <WarningsNotAsErrors>618</WarningsNotAsErrors>
    

    编辑:另外,查看@JonHanna 关于使用 EditorBrowsable attribute 的回答.

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

    编辑:
    #pragma warning disable 612, 618
    [Obsolete]
    #pragma warning restore 612, 618
    public class test1
    {...
    

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



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

    但是test1 test = new test1()将显示删除线。

    关于c# - 如何将代码标记为 "not for future use",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21125799/

    有关c# - 如何将代码标记为 "not for future use"的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    4. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

      我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

    5. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

      我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

    6. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    7. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    9. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    10. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    随机推荐