已分配值,从未使用过,但没有编译器消息

AGu*_*ald 4 c# variables

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

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

如果我构建应用程序,编译器会强调x,

赋值变量x,但从不使用它的值

对于y,我没有强调.为什么不?(VS 2008,.Net 3.5)

Eri*_*ert 9

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

/sf/answers/191889701/

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

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

  • @AGuyCalledGerhard:您的问题的答案是"因为我们的客户反馈和个人经验表明这是一种常见模式." 您完全有权享受个人喜好.如果要获取分配了非常量值的未使用局部变量的警告,请考虑使用Resharper,FXCOP或任何其他为您执行此分析的工具.如果您对此主题感兴趣,可以阅读2007年的这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2007/05/15/should-we-produce-warnings-for-unused-uninitialzied-内部fields.aspx (2认同)

小智 5

编译器强调x,

不,编译器没有.编辑强调.编译器没有能够绘制线的输出通道.

对于y,我没有强调.为什么不?

因为它被使用?

不要误解我的意思,但如果没有与变量范围相关的完整代码,那么就没有办法说明这是否是这样的.

整个计划:

位于.这不是整个程序;)甚至不是完整的课程.并且你不能在C#之外的类中使用变量.

  • 以这种方式思考:您的"常识​​和智能"告诉您编辑器中的其他代码分析功能是什么?例如,当您键入时,会发生很多事情:语法被着色,词汇,语法和语义分析错误正在产生,IntelliSense完成下拉列表和方法签名提示正在产生.所有这些都是由"命令行编译器"完成的吗? (4认同)
  • 回复:"编辑强调" - 这是一个脱毛的区别.**编译器告诉编辑器要强调什么**.您可能会说不,编辑器不执行下划线,Windows图形例程执行下划线,不,它们不执行下划线,显示器上的像素执行下划线. (3认同)
  • 正如其聪明的名称所示,*命令行编译器*是一个可以从命令行运行的工具.它只是实际编译器周围的一个薄壳.Visual Studio,命令行编译器,编辑器使用的语言服务以及生成有关错误波形信息的编译器之间的交互很复杂,随着时间的推移而发生变化,并且是一个实现细节. (3认同)
  • 回复:"没有完整的代码就没有办法说" - 我向你保证这是假的.这里有足够的信息来诊断症状. (2认同)