我的团队中有人试图修复空 catch 子句中的“变量未使用”警告。
try { ... } catch (Exception ex) { }
-> 给出有关未使用 ex 的警告。到目前为止,还不错。
修复是这样的:
try { ... } catch (Exception ex) { string s = ex.Message; }
看到这个,我想“太棒了,所以现在编译器会提示 没有被使用。”
但事实并非如此!那段代码没有警告,我不明白为什么。有什么想法吗?
附言。我知道禁止异常的包罗万象的条款是一件坏事,但那是另一个话题。我也知道通过这样做可以更好地消除初始警告,这也不是重点。
try { ... } catch (Exception) { }
或
try { ... } catch { }
最佳答案
在这种情况下,编译器检测到 s 已写入但未读取,并且有意抑制警告。
不管你信不信,原因是因为 C# 是一种垃圾收集语言。
你怎么想的?
好吧,请考虑以下内容。
您有一个程序调用返回字符串的方法 DoIt()。您没有 DoIt() 的源代码,但您希望在调试器中检查它的返回值是什么。
现在在您的特定情况下,您使用 DoIt() 是为了它的副作用,而不是它的返回值。所以你说
DoIt(); // discard the return value
现在你正在调试你的程序,你去查看 DoIt() 的返回值,它不在那里,因为当调试器在调用 DoIt() 后中断时,垃圾收集器可能已经已经清理了未使用的字符串。
事实上,托管调试器没有“查看前一个方法调用返回的内容”的工具。非托管 C++ 调试器具有该功能,因为它可以查看丢弃的返回值仍然存在的 EAX 寄存器,但您无法在托管代码中保证返回值在被丢弃后仍然存在。
现在,有人可能会争辩说这是一个有用的功能,调试器团队应该添加一个功能,如果在方法执行后立即有调试器断点,则返回值保持有效。那将是一个不错的功能,但我不是要求它的人;去问调试团队。
可怜的 C# 开发人员该怎么办?创建一个局部变量,将结果存储在局部变量中,然后在调试器中检查局部。调试器确实确保局部变量不会被积极地垃圾收集。
所以你这样做,然后编译器给你一个警告,你有一个只写入而永远不会读取的本地因为读取的东西不是程序的一部分,它是开发人员坐着的在那里看着调试器。这是一个非常恼人的用户体验!因此,我们检测到将非常量 值分配给从未读取 的局部变量或字段 的情况,并抑制该警告.如果你改变你的代码,让它变成 string s = "hello"; 那么你会开始收到警告,因为编译器的原因,嗯,这不可能是有人在绕过调试器的局限性,因为值就在那里,开发人员可以在没有调试器的情况下读取它。
这解释了那个。在许多其他情况下,我们会抑制有关从未读取过的变量的警告;一个detailed exegisis of all the compiler's policies因为我们什么时候报告警告,什么时候不报告警告,我会花很多时间来写,所以我想我会把它留在那里。
关于C# 编译器应该发出警告但不发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2740885/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.