【问题标题】:General programming - calling a non void method but not using value一般编程 - 调用非 void 方法但不使用值
【发布时间】:2009-08-05 05:02:50
【问题描述】:

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

【问题讨论】:

    标签: methods return-value call void


    【解决方案1】:

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

    int val = printf("Hello World");
    

    【讨论】:

    • 如果方法返回一个对象(没有垃圾收集器)怎么办?那么对象不会泄露吗?
    • 如果一个函数返回一个需要进行内存管理的对象,那么您可能会捕获它。大多数时候,当您忽略返回值时,它只是将状态返回给它,通常是一个 int 或一个 enum'd int ......所以你不必担心。当某物返回一个对象而你忽略它时,你能想到一个真实的例子吗?但如果它做了而你没有接受它,那将是一个泄漏......
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      (void) my_function_returning_a_value_i_want_to_ignore().
      

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

          如果这在 .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());
              }
          

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

          【讨论】:

            【解决方案6】:

            在 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 方代码时导致问题。此外,当然没有办法检查用户是否真的对返回的值做了一些有意义的事情。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多