【发布时间】:2009-08-05 05:02:50
【问题描述】:
这是一般编程,但如果它有所作为,我使用的是objective-c。假设有一个方法可以返回一个值,并且还执行一些操作,但是您不关心它返回的值,只关心它所做的事情。您是否会像调用该方法一样调用该方法是无效的?或者将结果放在一个变量中,然后删除它或忘记它?说出你的看法,如果你遇到这种情况你会怎么做。
【问题讨论】:
标签: methods return-value call void
这是一般编程,但如果它有所作为,我使用的是objective-c。假设有一个方法可以返回一个值,并且还执行一些操作,但是您不关心它返回的值,只关心它所做的事情。您是否会像调用该方法一样调用该方法是无效的?或者将结果放在一个变量中,然后删除它或忘记它?说出你的看法,如果你遇到这种情况你会怎么做。
【问题讨论】:
标签: methods return-value call void
一个常见的例子是 printf,它返回一个 int...但是你很少看到这个:
int val = printf("Hello World");
【讨论】:
是的,只要调用该方法,就好像它是无效的一样。你可能一直在做这件事而没有注意到它。赋值运算符 '=' 实际上返回一个值,但很少使用。
【讨论】:
这取决于环境(语言、工具、编码标准……)。
例如在 C 中,完全可以调用函数而不使用其值。像 printf 这样的函数,它返回一个 int,它一直都在完成。
有时不使用值会导致警告,这是不可取的。将值分配给变量然后不使用它只会导致另一个关于未使用变量的警告。对于这种情况,解决方案是通过在调用前加上 (void) 来将结果强制转换为 void,例如
(void) my_function_returning_a_value_i_want_to_ignore().
【讨论】:
实际上这里有两个不同的问题:
#2 的答案是响亮的“不”——当然,除非您正在使用一种非法的语言(想到早期的 Turbo Pascal)。定义一个变量只是为了丢弃它是绝对没有意义的。
第一部分并不那么容易。通常,返回值是有原因的 - 对于idempotent 函数,结果是函数的唯一目的;对于非幂等,它通常表示某种返回码,表示操作是否正常完成。当然也有例外——比如method chaining。
【讨论】:
如果这在 .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());
}
我并不真正关心返回类型,我只是想验证一个方法是在一个假对象上调用的。
【讨论】:
在 C 语言中这很常见,但有些地方可以这样做,而有些地方则不然。更高版本的 GCC 有一个function attribute,这样你就可以在使用函数时得到警告,而无需检查返回值:
如果具有此属性的函数的调用者不使用其返回值,
warn_unused_result属性会导致发出警告。这对于不检查结果是安全问题或始终是错误的函数很有用,例如 realloc。int fn () __attribute__ ((warn_unused_result)); int foo () { if (fn () < 0) return -1; fn (); return 0; }导致第 5 行出现警告。
上次我使用它时无法关闭生成的警告,这会在您编译不想修改的第 3 方代码时导致问题。此外,当然没有办法检查用户是否真的对返回的值做了一些有意义的事情。
【讨论】: