如何故意忽略返回值

sha*_*kin 15 c# syntax return-value

在某些使用C/C++的情况下,我可以在语法上向编译器指示故意忽略返回值:

int SomeOperation()
{
    // Do the operation

    return report_id;
}

int main()
{
    // We execute the operation, but in this particular context we
    // have no use of the report id returned.
    (void)SomeOperation();
}
Run Code Online (Sandbox Code Playgroud)

我发现这是一个公平的做法,首先是因为大多数编译器不会在这里产生警告,其次是因为它向未来的开发人员明确表明作者有意识地选择忽略回报.它使作者的思想痕迹不含糊.

据我所知,C#编译器不会抱怨隐式忽略的返回值,但我想知道是否有类似的约定用于向其他开发人员明确指示.

回答这里的一些人质疑这个约定的实际使用(或者它会显示糟糕的设计以使方法具有潜在的不重要的返回值).

一个真实的.NET示例(我可能应该从一开始就基于问题)是Mutex::WaitOne()不带参数的重载.只有在安全获取互斥锁时它才会返回,否则它永远不会返回.布尔返回值是针对其他重载的,您可能在返回时最终没有拥有互斥锁.

所以在我的推理中,我想在我的多线程代码中指出我已经选择忽略返回:

Mutex mtx = new Mutex();
(void)mtx.WaitOne();
Run Code Online (Sandbox Code Playgroud)

因为返回值永远不会是任何东西true.

ano*_*ard 12

如果您想向其他开发人员表明并明确表示有意忽略返回值,请对其进行评论.

SomeMethod(); // return value ignored - $REASON
Run Code Online (Sandbox Code Playgroud)


bba*_*els 10

从C#7.0开始,您可以使用丢弃运算符'_'指示故意忽略的返回值。

int SomeOperation()
{
    return report_id;
}

int main()
{
    _ = SomeOperation();
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以在此处查看Microsoft文档。


Ste*_*ger 9

我只能想到一种情况,即在C#中不允许忽略"返回值":发生错误时.这应该通过抛出异常来提供,这使得它不可能被忽略.

在其他情况下,忽略返回值是(或更好:必须)完全安全且完全没有臭味.

我还是看不出这一点.为什么要改进代码呢?您指定通过不将返回值分配给变量来忽略返回值.

  • 如果你的代码中不需要这个值,一切都很好.
  • 如果需要,您将无法编写代码.
  • 如果存在必须处理的特殊情况且绝不能隐式忽略,则应抛出异常.
  • 如果被调用的方法没有返回值并且稍后获得它,则必须将其设计为不破坏忽略它的现有代码.现有的调用代码不会更改.

我忘了案吗?

  • 我非常不同意**"它是(...)根本没有臭味来忽略返回值",请阅读[Pure](http://msdn.microsoft.com/en-us/library/system方法的.diagnostics.contracts.pureattribute(v = vs.110).aspx)属性.不使用纯方法的返回值肯定是一个错误.例如,编写`startDate.AddDays(1)`使`startDate`保持不变并返回将来某天的新日期,并忽略该新日期表示开发人员认为startDate已更改. (7认同)
  • @PopCatalin:“错误代码**不应该在.NET中使用**..”为什么你相信这是普遍正确的? (3认同)

Tam*_*ege 6

Microsoft C#编译器在忽略返回时不会生成警告.它不需要因为有垃圾收集器所以不会因为忽略返回的对象而导致内存泄漏(除非它们当然是IDisposable).因此,不需要显式"覆盖"编译器.

编辑:此外,我认为"可维护性"问题更像是文档和命名实践问题.我知道这只是一个例子,但你不会指望一个叫做SomeOperation返回a 的方法ReportId.但是,您会期望一种GetReportId方法返回一个ReportId没有很多副作用的方法.实际上,忽略所调用方法的返回值GetReportId会相当奇怪.因此,请确保您为方法命名,并且人们不会怀疑函数调用的效果.

编辑2:在这个互斥体的例子中,我认为正确的用法实际上不会忽略返回值.即使当前实现永远不会返回false,我认为仍然检查返回值是一个好习惯,以防万一您将来最终使用另一个实现,或者他们在.NET Framework的未来版本中更改行为或东西:

if (mutex.WaitOne())
{
   // Your code here
}
else
{
   // Optionally, some error handling here
}
Run Code Online (Sandbox Code Playgroud)