2009-08-05 6 views
1

これは一般的なプログラミングですが、違いがある場合はobjective-cを使用しています。値を返すメソッドと、いくつかのアクションを実行するメソッドがあるとしますが、返す値は気にしません。あたかもそれが無効であるかのようにメソッドを呼び出すでしょうか?あるいは、結果を変数に入れて、それを削除するか、それを忘れてしまいますか?このような状況があれば、あなたの意見を述べてください。一般的なプログラミング - 値を使用しない非voidメソッドの呼び出し

答えて

4

この一般的な例は、int型を返す、printfのです...しかし、あなたはほとんどこれを見ていない:それは無効であるかのよう

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

私が知る必要があるすべてのありがとう、ありがとう。 – mk12

+0

メソッドがオブジェクトを返す場合(ガベージコレクタはありません)それでオブジェクトが漏れてしまうのではないでしょうか? – mk12

+0

関数がメモリ管理が必要なオブジェクトを返した場合は、おそらくキャプチャしているはずです。ほとんどの場合、戻り値を無視すると、通常はintまたはenumのint型のステータスに戻ります。そうすれば、心配する必要はありません。オブジェクトを返す何かがそれを無視したときに実際のインスタンスを考えることができますか?しかし、もしあなたがそれを取っていないなら、リークになるでしょう... – micmoo

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では、値を使用せずに関数を呼び出すことは完全に可能です。 intを返すprintfのような関数では、常に実行されます。

値を使用しないと警告が表示されることがありますが、これは望ましくありません。値を変数に代入して使用しないと、未使用の変数について別の警告が出ます。この場合、解決策は、コールに(空白)をプレフィックスとして付けることによって結果をボイドにキャストすることです。

(void) my_function_returning_a_value_i_want_to_ignore(). 
+0

私はそれを覚えています。 – mk12

1

二つの別々の問題は、実際には、ここにあります

  1. あなたは、戻り値を気にする必要がありますか?
  2. あなたはそれを使用しない変数に割り当てる必要がありますか?

#2への答えは、もちろん、それが違法となる言語で作業しているのでなければ(ターボパスカルが心に浮かんでいます)。変数を定義するだけでは、それを放棄することは絶対にありません。

最初の部分はあまり簡単ではありません。一般的に、理由値が返されます - idempotent関数の結果は関数の唯一の目的です。非冪等の場合、通常、操作が正常に完了したかどうかを示す何らかの戻りコードを表します。もちろん、例外はあります - method chainingのように。

0

Cでは非常に一般的ですが、本当にそうでない場所やそうでない場所もあります。

この属性を持つ関数の呼び出し元がない場合warn_unused_result属性は警告が発せられることになり:GCCの最近のバージョンでは、関数が戻り値をチェックせずに使用されている場合に警告を得ることができるようにfunction attributeを持っていますその戻り値を使用しないでください。これは、結果がセキュリティ上の問題であるか、reallocなどのバグであるかをチェックしない関数で役に立ちます。ライン上の警告で

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

結果5.

私はこれを使用前回サードパーティのコードあなたドンをコンパイルしているときに問題が発生し生成される警告をオフにする方法はありませんでした変更したくない。また、もちろん、ユーザーが実際に返された値で分かりやすいかどうかを確認する方法はありません。

関連する問題