一般编程 - 调用非void方法但不使用值
这是一般编程,但如果它有所作为,我使用的是Objective-C。假设有一个方法返回一个值,并执行一些操作,但是你不关心它返回的值,而只关心它所做的事情。你会把这个方法称为无效吗?或者将结果放在一个变量中,然后删除它或忘记它?说出你的意见,如果你有这种情况,你会怎么做。一般编程 - 调用非void方法但不使用值
的一个常见的例子是的printf,它返回一个int ...但你很少看到这一点:
int val = printf("Hello World");
如果这在.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中,完全可以在不使用其值的情况下调用函数。有了像printf这样的返回int类型的函数,它一直都是这样做的。
有时不使用值会导致警告,这是不可取的。赋值给一个变量,然后不使用它只会导致另一个关于未使用变量的警告。对于这种情况,解决方案是通过用(void)前缀来将结果强制转换为无效,例如,
(void) my_function_returning_a_value_i_want_to_ignore().
有两个不同的问题在这里,实际上是:
- 你应该关心的返回值?
- 如果你将它分配给一个变量,你不会使用?
#2的答案是一个响亮的“否” - 当然,除非你使用的语言是非法的(早期Turbo Pascal浮现)。定义一个变量只会抛弃它是绝对没有意义的。
第一部分并不那么容易。一般来说,有一个原因值返回 - 对于idempotent函数结果是函数的唯一目的;对于非幂等,它通常表示某种返回码,表示操作是否正常完成。当然也有例外 - 如method chaining。
在C中这是很常见的,但有些地方可以这样做,也可以在其他地方没有。GCC的更高版本具有function attribute这样,当没有检查返回值被使用的功能,你可以得到一个警告:
的
warn_unused_result
属性将导致警告如果函数与此属性的调用者被发射不使用它的返回值。这对于没有检查结果是安全问题还是总是bug(如realloc)的函数很有用。int fn() __attribute__ ((warn_unused_result)); int foo() { if (fn() < 0) return -1; fn(); return 0; }
导致警告第5行
我最后一次使用这个没有关闭生成的警告,这会导致问题,当你编译第三方代码,你不要的方式不想修改。而且,当然也无法检查用户是否真的对返回的值做了一些合理的处理。
好的,谢谢所有我需要知道的。 – mk12 2009-08-05 06:29:03
如果方法返回一个对象(没有垃圾收集器)会怎么样?那么物体是否会泄漏? – mk12 2009-08-17 02:00:46