C# 为什么用户定义类没有“声明但从未使用”警告?

C# 为什么用户定义类没有“声明但从未使用”警告?,c#,C#,在C语言中,当您声明但不使用内置类或结构时,您会收到一条已声明但从未使用过的警告,即使变量已分配给,如以下代码: string myStr; myStr = "foo"; return; 但是,对于用户定义的类或结构,您不会得到相同的警告: Bar myBar; myBar = new Bar(); return; 为什么在后一种情况下没有警告?如果构造器有副作用,你可以说是newbar;赋值的唯一副作用是赋值运算符重载。但是,如果操作员没有过载,VisualStudio可以对此进行检查,并

在C语言中,当您声明但不使用内置类或结构时,您会收到一条已声明但从未使用过的警告,即使变量已分配给,如以下代码:

string myStr;
myStr = "foo";
return;
但是,对于用户定义的类或结构,您不会得到相同的警告:

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

为什么在后一种情况下没有警告?如果构造器有副作用,你可以说是newbar;赋值的唯一副作用是赋值运算符重载。但是,如果操作员没有过载,VisualStudio可以对此进行检查,并发出警告。没有这样做有技术原因吗?

Resharper将显示问题-请参阅

代码分析还将显示问题-


至于为什么在没有代码分析或Resharper的情况下,它现在不会显示给您,请参阅,基本上它是“按设计”显示的。

Resharper将显示问题-请参阅

代码分析还将显示问题-


至于为什么在没有代码分析或Resharper的情况下它现在不会显示给您,请参见,基本上它是“按设计”显示的。

我认为这只适用于值类型。赋值运算符不能重载,尽管您可以定义隐式强制转换运算符。顺便说一下,运行时不是编译时。并非所有事情都可以在编译时确定。因此,不要指望编译器会给出超智能的建议,运行时与编译时是答案。除非您编写了类,否则您不知道它在运行时会做什么。编译器没有编写它-它怎么知道你没有在构造函数中做一些奇怪的事情,或者DI系统不会自动实例化你的类型,或者您没有需要初始化的静态构造函数,因此即使没有使用返回值,新的Blah也很有用?C编译器无法深入查看间接调用的代码。它既没有MSIL反编译器,也没有知道MSIL会做什么的智能。它必须假设构造函数除了初始化类对象之外还有其他有用的副作用。尽管它不应该,但C语言规范并不要求它。警告只有在99.9%的时间准确时才有用。这是应该由静态代码分析器完成的工作。周围有很多。他们的警告通常需要被抑制:表明在这种情况下不显示警告不是因为无法检测到,而是因为可以检测到警告,但这让开发人员非常恼火。我认为这只适用于值类型。赋值运算符不能重载,尽管您可以定义隐式强制转换运算符。顺便说一下,运行时不是编译时。并非所有事情都可以在编译时确定。因此,不要指望编译器会给出超智能的建议,运行时与编译时是答案。除非您编写了类,否则您不知道它在运行时会做什么。编译器没有编写它-它怎么知道你没有在构造函数中做一些奇怪的事情,或者DI系统不会自动实例化你的类型,或者您没有需要初始化的静态构造函数,因此即使没有使用返回值,新的Blah也很有用?C编译器无法深入查看间接调用的代码。它既没有MSIL反编译器,也没有知道MSIL会做什么的智能。它必须假设构造函数除了初始化类对象之外还有其他有用的副作用。尽管它不应该,但C语言规范并不要求它。警告只有在99.9%的时间准确时才有用。这是应该由静态代码分析器完成的工作。周围有很多。他们的警告通常需要被抑制:这表明在这种情况下没有显示警告,不是因为它无法被检测到,而是因为它可以被检测到,但它让开发人员非常恼火。嘿,伟大的设计基于愚蠢的开发人员被激怒。公平地说,临时变量对于查看函数调用的返回值非常有用。IDE确实允许您以其他方式获取这些信息,但变量确实让它变得非常简单。因此,这种权衡是合理的——特别是当它们提供了其他方法(如代码分析)来强制执行它时,如果你真的想这样做的话。它们是合理的,但在这一点上发出警告是完全合适的。在完成调试后,或者至少在提交代码时,您应该清理无意义的变量分配。在许多工作场所,警告被强制视为错误。在这种情况下,现在你有一个人在岩石和坚硬的地方之间。我需要这个变量来调试-但现在我无法编译这个愚蠢的东西当然,他们可以禁用警告,但这需要时间。呵呵,伟大的设计基于愚蠢的开发人员被激怒。公平地说,临时变量非常有用
有助于查看函数调用的返回值。IDE确实允许您以其他方式获取这些信息,但变量确实让它变得非常简单。因此,这种权衡是合理的——特别是当它们提供了其他方法(如代码分析)来强制执行它时,如果你真的想这样做的话。它们是合理的,但在这一点上发出警告是完全合适的。在完成调试后,或者至少在提交代码时,您应该清理无意义的变量分配。在许多工作场所,警告被强制视为错误。在这种情况下,现在你有一个人在岩石和坚硬的地方之间。我需要这个变量来调试-但现在我无法编译这个愚蠢的东西当然,他们可以禁用警告,但这需要时间