【问题标题】:value assigned, never used, but no compiler message赋值,从未使用过,但没有编译器消息
【发布时间】:2012-02-01 08:30:38
【问题描述】:

.net 网络应用程序的网络形式的整个程序:

namespace WebApplication1
{
   public partial class WebForm1 : System.Web.UI.Page
   {
     protected void Page_Load(object sender, EventArgs e)
     {
        string x = "";
        string y = String.Empty;
     }
   }
}

如果我构建应用程序,编译器会在 x 下划线,

变量 x 被赋值,但它的值从未被使用过

对于 y,我没有下划线。为什么不? (VS 2008,.Net 3.5)

【问题讨论】:

标签: c# variables


【解决方案1】:

我在这里详细回答你的问题:

https://stackoverflow.com/a/2741281/88656

简而言之:编译器在流分析过程中检测到本地已写入但未读取。如果写入本地的值是非常量,它会故意抑制警告。 String.Empty 不是一个常量,它是一个只读字段,很奇怪。但是空字符串文字 一个常量。这就是为什么您会看到带有文字的警告而不是字段的警告。

编译器推断您可能会将表达式的值分配给未读本地以便于调试程序。我们不希望您每次引入解释变量以帮助调试时都必须关闭“警告就是错误”。在这种情况下,显然您没有使用变量来检查 String.Empty 的输出,这一事实在编译器中丢失了;它不知道字段引用的语义是什么。

【讨论】:

  • "String.Empty 不是常量,它是只读字段,奇怪的是"这是设计决策还是错误?
  • @lukas:这是一个问答网站;如果您有问题,请发布问题!但是在这种情况下,它已经发布了很多次。 stackoverflow.com/questions/507923/…
  • 编译器为什么要我使用这个变量是为了方便调试?我个人喜欢 String.Empty,因为它使程序更具可读性。而且我更喜欢收到未使用变量的警告,因为这种情况经常发生。
  • @AGuyCalledGerhard:您的问题的答案是“因为我们的客户反馈和个人经验表明这是一种常见模式。”。您完全有权选择您的个人喜好。如果您想针对分配了非常量值的未使用局部变量获得警告,请考虑使用 Resharper、FXCOP 或任何数量的其他工具来为您执行此分析。如果您对这个主题感兴趣,您可以阅读 2007 年的这篇文章:blogs.msdn.com/b/ericlippert/archive/2007/05/15/…
【解决方案2】:

编译器在 x 下划线,

不,编译器没有。编辑强调。编译器没有能够画线的输出通道。

对于 y,我没有下划线。为什么不呢?

因为它被使用了?

不要误会我的意思,但是如果没有与变量范围相关的完整代码,根本无法说这是否是那样。

整个程序:

撒谎。这不是整个程序;)它甚至不是完整的课程。而且你不能在 C# 中在一个类之外有一个变量。

【讨论】:

  • @Jan-FrederikCarl:当然,编译的不是整个程序。一个简短但完整的程序肯定会有所帮助。
  • Re:“编辑下划线”——这是一个令人毛骨悚然的区别。 编译器告诉编辑器下划线。你不妨说不,编辑器不做下划线,windows图形例程做下划线,不,他们不做下划线,显示器上的像素做下划线。
  • 回复:“没有完整的代码就没有办法说”——我向你保证这是错误的。这里有足够的信息来诊断症状。
  • 命令行编译器,顾名思义,是一个可以从命令行运行的工具。它只是实际编译器周围的一个薄壳。 Visual Studio、命令行编译器、编辑器使用的语言服务以及生成错误曲线信息的编译器之间的交互是复杂的,随着时间的推移而变化,并且是一个实现细节。
  • 这样想:你的“常识和智慧”告诉你编辑器中的其他代码分析功能是什么?例如,当您打字时,会发生很多事情:语法被着色,产生词汇、语法和语义分析错误,产生 IntelliSense 完成下拉列表和方法签名提示。所有这些都是由“命令行编译器”完成的吗?
【解决方案3】:

如果我理解了我读对的文章,编译器不知道 String.Empty 是什么,因为它是一个只读字段。 String.Empty 在运行时分配。所以在构建程序时我没有收到任何警告。

The article

【讨论】:

  • 您说的是真的,但未能为您的问题提供真正的答案,您已成功区分 String.Empty"",但错误应该 仍然适用,因为错误会做出正确的陈述:“The variable 'y' is assigned to but its value is never used”仍然适用。见stackoverflow.com/a/2741281
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多