2017-06-05 106 views
1

在C#中,当你声明,但不使用内置类或结构,你得到一个“声明,但从未使用过”警告,即使该变量赋值,如下面的代码:为什么用户定义的类没有“声明但未使用”警告?

string myStr; 
myStr = "foo"; 
return; 

但是你没有得到一个用户定义的类或结构相同的警告:

Bar myBar; 
myBar = new Bar(); 
return; 

为什么会出现在后一种情况下,没有警告?如果构造函数存在副作用,那么可以说new Bar();,并且分配操作符过载时,分配的副作用的唯一方法是。但是,Visual Studio可以检查这一点,如果操作符没有超载,则发出警告,但事实并非如此。有没有技术上的原因,为什么它不这样做?

+0

我认为这只适用于值类型。 – Transcendent

+0

赋值运算符不能被重载,尽管您可以定义隐式转换运算符。顺便说一下,运行时间不是编译时间。并非所有的东西都可以在编译时确定。所以不要期望编译器提供超级智能建议 –

+0

是的,运行时间与编译时间是答案。除非您编写它,否则您不知道类将在运行时执行什么操作。编译器没有写它 - 它应该怎么知道你没有在构造器中做一些时髦的东西,或者DI系统不会自动实例化你的类型,或者你没有需要初始化的静态构造函数,以便即使没有使用返回值,new Blah()也是有用的? – Charleh

回答

4

resharper会显示问题 - 请参阅Value assigned is not used in any execution path - C#

代码分析也会显示问题 - https://msdn.microsoft.com/library/ms182278.aspx。至于为什么它现在没有显示给你(无代码分析或Resharper),请参见https://stackoverflow.com/a/10629031/34092https://github.com/dotnet/roslyn/issues/15695(基本上是'按设计')。

+1

嘿,伟大的设计基于愚蠢的开发人员被“激怒”。 – Jez

+0

公平起见,临时变量对于查看函数调用的返回值非常有帮助。 IDE确实可以让你以其他方式获取这些信息,但是一个变量确实使它变得非常容易。所以权衡是合理的 - 特别是当他们提供其他方式(例如代码分析)来执行它,如果你真的想。 – mjwills

+0

他们是,但在这一点上发出警告是完全合适的。当你完成调试时,你*应该*清理你的无意义的变量赋值,或者至少来提交你的代码。 – Jez

相关问题