C# 赋值,从未使用,但没有编译器消息
整个程序以.net web应用程序的web形式运行:C# 赋值,从未使用,但没有编译器消息,c#,variables,C#,Variables,整个程序以.net web应用程序的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; } } }
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,我没有下划线。为什么不呢?(与2008年相比,.Net 3.5)
编译器在x下划线
不,编译器没有。编辑强调。编译器没有能够绘制线条的输出通道
对于y,我没有下划线。为什么不呢
因为它被使用了
请不要误解我的意思,但是如果没有与变量范围相关的完整代码,就无法判断这是否是这样
整个计划:
撒谎。这不是整个计划;)它甚至不是完整的类。而且你不能在类之外的C#中有一个变量
如果我正确理解了我阅读的文章,编译器就不知道String.Empty是什么,因为它是只读字段。String.Empty是在运行时分配的。所以我在构建程序时没有收到任何警告
我在这里详细回答您的问题: 简而言之:编译器在流分析过程中检测到本地数据被写入但未被读取。如果写入本地的值是非常量,它会故意抑制警告
String.Empty
不是一个常量,它是一个只读字段,奇怪的是。但是空字符串文本是一个常量。这就是为什么您会看到带有文字的警告,而不是字段的警告
编译器推断您可能正在将表达式的值分配给未读的本地表达式,以便于调试程序。我们不希望每次引入解释性变量以协助调试时都必须关闭“警告是错误”。在本例中,显然您没有使用变量检查
String.Empty的输出,编译器将丢失该变量;它不知道字段引用的语义是什么。@Jan FrederikCarl:当然,编译的不是整个程序。一个简短但完整的程序肯定会有所帮助。Re:“编辑强调”——这是一个令人毛骨悚然的区别。编译器告诉编辑器在什么下面划线。你可能会说,不,编辑器不做下划线,windows图形例程做下划线,不,他们不做下划线,显示器上的像素做下划线。Re:“没有完整的代码,就没有办法说”——我向你保证这是错误的。这里有足够的信息来诊断症状。命令行编译器,正如它聪明的名字所表明的,是一个可以从命令行运行的工具。它只是围绕实际编译器的薄壳。Visual Studio、命令行编译器、编辑器使用的语言服务以及生成错误波形信息的编译器之间的交互是复杂的,随着时间的推移发生了变化,并且是一个实现细节。请这样思考:您的“常识和智能”是什么告诉您编辑器中的其他代码分析功能?例如,当你打字时,会发生很多事情:语法被着色,词汇、语法和语义分析错误被产生,IntelliSense完成下拉列表和方法签名提示被产生。所有这些都是由“命令行编译器”完成的吗?可能与您所说的重复是正确的,但无法提供问题的真实答案,您已成功区分了字符串。空的来自”
,但错误仍应适用,因为该错误将生成正确的语句:“变量“y”已分配给,但其值从未使用过
”仍然适用。请参阅。“String.Empty不是常数,它是只读字段,这很奇怪“这是一个设计决定还是一个错误?”卢卡斯:这是一个问答网站;如果你有问题,发布一个问题!但在这种情况下,它已经被张贴了很多次。为什么编译器会认为我使用变量是为了方便调试?我个人喜欢String.Empty,因为它使程序更可读。我甚至更想得到一个未使用变量的警告,因为这种情况经常发生。@AGuyCalledGerhard:你的问题的答案是“因为我们的客户反馈和个人经验表明这是一种常见的模式。”。你完全有权选择你的个人喜好。如果您想得到未赋值的本地变量的警告,这些变量被赋值为非常量值,请考虑使用RESARPER、FXCOP或为您执行此分析的任何其他工具。如果您对这个主题感兴趣,您可以阅读2007年的这篇文章: