c# - 调用非 void 函数而不使用其返回值。实际发生了什么?

标签 c# java c++ return-value void

所以,我发现了一个类似的问题 here ,但答案更多的是关于风格以及你是否能够做到。

我的问题是,当您调用一个返回对象的非 void 函数但您从未分配或使用所述返回对象时,实际会发生什么?所以,少说你是否可以,因为我绝对知道你可以并且理解上面链接的另一个问题......编译器/运行时环境是做什么的?

这不是特定于语言的问题,但如果您回答,请说明您所指的语言,因为行为会有所不同。

最佳答案

我相信对于 C# 和 Java,结果最终都会在堆栈上,然后编译器会强制弹出指令忽略它。 Eric Lippert 在 "The void is invariant" 上的博客文章有更多关于这方面的信息。

例如,考虑以下 C# 代码:

using System;

public class Test 
{
    static int Foo() { return 10; }
    
    public static void Main()
    {
        Foo();
        Foo();
    }
}

Main 方法生成(由 MS C# 4 编译器)的 IL 是:

.method public hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 8
    L_0000: call int32 Test::Foo()
    L_0005: pop 
    L_0006: call int32 Test::Foo()
    L_000b: pop 
    L_000c: ret 
}

注意对 pop 的调用 - 如果您将 Foo 设为 void 方法,这些调用就会消失。

关于c# - 调用非 void 函数而不使用其返回值。实际发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3998368/

相关文章:

c# - 添加dll以发布

c# - 使用 XSD 文件生成 XML 文件

c# - 更新到 ASP.NET Core 2 后无法获取配置部分

java - JSF : how to force creating a new managed bean instance for every browse instance

c++ - 如果没有插入而只有 .find(),在多线程上使用 C++ STL 容器是否安全?

c++ - 为什么这在 C++ 中抛出 "CryptoMaterial: this object contains invalid values",但在 python 中工作正常

c# - Rijndael 算法

java - 静态 vector 乘法 - 无新对象

java - 从 Java 中的 mySQL 记录集初始化二维矩阵

c++ - FFTW3 : Interpret fftw_plan_r2c_1d output and access imaginary part of output