这是一般编程,但如果它有所作为,我正在使用 Objective-C。假设有一个方法返回一个值,并且还执行一些操作,但您不关心它返回的值,只关心它所做的事情。您是否会像调用 void 一样调用该方法?或者将结果放入变量中然后将其删除或忘记?说出你的看法,如果你遇到这种情况你会怎么做。

有帮助吗?

解决方案

的一个常见的例子是printf的,它返回一个int ...但很少看到这一点:

int val = printf("Hello World");

其他提示

呀只是调用该方法,如果它是无效的。你可能做这一切的时候没有注意到它。赋值运算符“=”实际上返回的值,但它很少使用。

这取决于环境(语言,工具,编码标准,...)。

例如在C,它是完全可以调用一个函数,而无需使用其值。与如printf一些功能,这些功能返回int,它完成所有的时间。

有时不使用的值将导致警告,这是不希望的。值赋值给一个变量,然后不使用它会导致只对未使用的变量一个警告。对于这种情况下的解决办法是把结果的前缀来(无效)该呼叫,e.g作废。

(void) my_function_returning_a_value_i_want_to_ignore().

实际上,这里有两个单独的问题:

  1. 您应该关心返回值吗?
  2. 您应该将其分配给您不打算使用的变量吗?

第 2 个问题的答案是响亮的“否”——当然,除非您使用的语言是非法的(我想到了早期的 Turbo Pascal)。定义一个变量只是为了丢弃它是绝对没有意义的。

第一部分并不那么容易。一般来说,返回值是有原因的 - for 幂等的 函数的结果是函数的唯一目的;对于非幂等,它通常表示某种返回代码,表示操作是否正常完成。当然也有例外——比如 方法链接.

如果这在 .Net 中很常见(例如),则可能存在代码破坏问题 质量管理体系.

当我调用一个返回我忽略的值的函数时,通常是因为我在测试中执行此操作以验证行为。下面是一个 C# 示例:

    [Fact]
    public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
    {
        var statValueRepository = new Mock<IStatValueRepository>();

        new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();

        statValueRepository.Verify(x => x.GetStatValues());
    }

我并不真正关心返回类型,我只是想验证是否在假对象上调用了方法。

在C中,它是很常见的,但也有地方,这是确定这样做,其他地方真的不是。 GCC的更高版本具有功能属性这样就可以得到一个警告,如果不检查返回值被使用的功能:

  

warn_unused_result属性使如果该函数的具有这种属性的呼叫者不使用它的返回值被发射的警告。这对于其中不检查结果的功能有用要么一个安全问题或总是一个错误,如realloc的。

     int fn () __attribute__ ((warn_unused_result));
     int foo ()
     {
       if (fn () < 0) return -1;
       fn ();
       return 0;
     }
     

导致警告第5行

我最后一次使用这个没有关闭生成的警告,这导致当你编译你不想修改第三方代码问题的方式。此外,还有当然是没有办法检查用户是否确实做了明智与返回的值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top