1

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

4

6 回答 6

4

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

int val = printf("Hello World");
于 2009-08-05T05:10:29.197 回答
3

是的,只要调用该方法,就好像它是无效的一样。你可能一直在做这件事而没有注意到它。赋值运算符 '=' 实际上返回一个值,但它很少使用。

于 2009-08-05T05:10:38.853 回答
2

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

例如,在 C 中,完全可以调用函数而不使用其值。使用一些函数,如 printf,它返回一个 int,它一直都在完成。

有时不使用值会导致警告,这是不可取的。将值分配给变量然后不使用它只会导致另一个关于未使用变量的警告。对于这种情况,解决方案是通过在调用前加上 (void) 来将结果转换为 void,例如

(void) my_function_returning_a_value_i_want_to_ignore().
于 2009-08-05T05:14:22.403 回答
1

实际上,这里有两个不同的问题:

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

对#2 的回答是响亮的“NO”——当然,除非你正在使用一种非法的语言(想到早期的 Turbo Pascal)。定义一个变量只是为了把它扔掉是绝对没有意义的。

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

于 2009-08-05T05:15:51.213 回答
0

如果这在 .Net 中很常见(例如),则代码破坏CQS可能存在问题。

当我调用一个返回我忽略的值的函数时,通常是因为我在测试中这样做以验证行为。这是 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());
    }

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

于 2009-08-05T05:06:48.830 回答
0

在 C 语言中这很常见,但有些地方可以这样做,而其他地方则不能这样做。更高版本的 GCC 具有function 属性,因此您可以在使用函数时收到警告,而无需检查返回值:

如果具有此属性的函数的调用者不使用其返回值,则该warn_unused_result属性会发出警告。这对于不检查结果是安全问题或始终是错误的函数很有用,例如 realloc。

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

导致第 5 行出现警告。

上次我使用它时,无法关闭生成的警告,这会在您编译不想修改的第 3 方代码时导致问题。此外,当然没有办法检查用户是否真的对返回的值做了一些有意义的事情。

于 2009-08-05T06:29:40.330 回答