2009-08-05 89 views
1

這是一般編程,但如果它有所作爲,我使用的是Objective-C。假設有一個方法返回一個值,並執行一些操作,但是你不關心它返回的值,而只關心它所做的事情。你會把這個方法稱爲無效嗎?或者將結果放在一個變量中,然後刪除它或忘記它?說出你的意見,如果你有這種情況,你會怎麼做。一般編程 - 調用非void方法但不使用值

回答

4

的一個常見的例子是的printf,它返回一個int ...但你很少看到這一點:

int val = printf("Hello World"); 
+0

好的,謝謝所有我需要知道的。 – mk12 2009-08-05 06:29:03

+0

如果方法返回一個對象(沒有垃圾收集器)會怎麼樣?那麼物體是否會泄漏? – mk12 2009-08-17 02:00:46

0

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

我真的不關心的返回類型,我只是想驗證的方法被稱爲假的對象。

3

呀只是調用該方法,如果它是無效的。你可能會一直這樣做,而不會注意到它。賦值運算符'='實際上會返回一個值,但它很少被使用。

2

這取決於環境(語言,工具,編碼標準等)。

例如在C中,完全可以在不使用其值的情況下調用函數。有了像printf這樣的返回int類型的函數,它一直都是這樣做的。

有時不使用值會導致警告,這是不可取的。賦值給一個變量,然後不使用它只會導致另一個關於未使用變量的警告。對於這種情況,解決方案是通過用(void)前綴來將結果強制轉換爲無效,例如,

(void) my_function_returning_a_value_i_want_to_ignore(). 
1

有兩個不同的問題在這裏,實際上是:

  1. 你應該關心的返回值?
  2. 如果你將它分配給一個變量,你不會使用?

#2的答案是一個響亮的「否」 - 當然,除非你使用的語言是非法的(早期Turbo Pascal浮現)。定義一個變量只會拋棄它是絕對沒有意義的。

第一部分並不那麼容易。一般來說,有一個原因值返回 - 對於idempotent函數結果是函數的唯一目的;對於非冪等,它通常表示某種返回碼,表示操作是否正常完成。當然也有例外 - 如method chaining

0

在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行

我最後一次使用這個沒有關閉生成的警告,這會導致問題,當你編譯第三方代碼,你不要的方式不想修改。而且,當然也無法檢查用戶是否真的對返回的值做了一些合理的處理。

相關問題