なぜ、何が例外をスロー(または開発者に警告)実行しない文ではないのですか?
-
21-09-2019 - |
質問
私はVB.NETでのステートメントで数回かましてきた(いないことを確認、この効果は、C#に存在する場合)、自己参照のように見えるが、彼らが実行しているとき、彼らは実際には何もしないこと彼らはターゲットを必要としているため1が提供されていません。たとえばます:
Dim MyString as string = "String to test"
' Neither of these lines do anything '
MyString.Replace(" ", "-")
MyString.Substring(0,5)
' This will return the original string, because neither statement did anything '
Messagebox.Show(MyString)
どちらの場合も、.NET文がに結果を割り当てるために、ターゲットを必要としていることを気にしていないようだ、と私はそれを1つずつ与えていません。 IDE /コンパイラは、この効果を私に警告、または例外「StatementDoesntDoAnythingは」スローされないことはありませんという理由はありますか?コードはそれが何かを変更することはありませんように形成されているので、それは明らかだミスタイプされます。
解決
それは、いくつかの機能はいくつかの副作用がそうであるように、戻り値を無視することは意図していないことを伝えると、値を返すことは難しいことができます。
「単に」戻り値は持っているでしょう。関数は、そうでない場合は、彼らが行っているだろう、コンパイラがそれらをチェック持つようにそのようにマークされる、とばかり優先されていないことや、明らかに投資(上十分なリターンを持っていると判断しますそれ:。)
他のヒント
はい、それは素晴らしいことです。
あなたはFxCopのを試みることができる。しかし、それは.NETアセンブリに微妙なプログラミングエラーの多くを見つけることができます。
の方法は、必要に応じてプログラマによって処理される値を返す多くの例があります。コンパイラは、この特定のメソッドは何もしないことを知ってする方法はありません。それは副作用があるかもしれないし、あなたがメソッドの戻り値で何もしないことを選択したという事実は、あなたの部分の意識の決断にする必要があります。
コンパイラは、これは、あなたがあまりにも多くの偽の警告を取得しますが起こったことをすべてのインスタンスを警告することを選択した場合。
関数が「何かをする」場合、コンパイラが判断するのは困難であることが多いです。コンパイラがない場合を除き、厳密な、それが機能するかどうかを決定することはできません呼び出しは副作用があります。
IPAが大幅コンパイラのメモリ要件を増加させること遅いプロセスであるので、デフォルトではほとんどのコンパイラはこれを行わないでください。
このはC、C ++からの振る舞いを継承している、とあなたは関数/メソッドからの戻り値を使用するかどうかを選択できるように、原料の束を行う関数/メソッドを書くときorioginally ...行われていましたその後、あなたはそれを呼び出すときに、あなたが書いのオプションがあり、いくつかの値を返します。
variableName = functionName([parameterlist]);
あなたが何かにreturnb値を使用したい場合、または単に
functionName([parameterlist]);
あなたがいない場合。
あなたが述べたように(あなたが言及したもののような)は副作用を持たない関数の方法については、これは非常に意味がありませんが、新しい言語のためにそれを変更すると、合致多くの他の多くの言語の長い歴史にカウンタを実行しますこの規格へ...
私じゃないことを確認持っまだ変数に入れるべき戻り値を強制するかどうかのために別のキーワードは、さまざまな理由のために良いでしょう。
1)戻り値はoptinalあるときにキーワードを追加すると仮定し(それゆえ)、それは通常、必須で暗示は、警告のトン
をコンパイルするか、発行を停止するコードの多くを引き起こします2)戻り値が強制されている場合、一部の人々は、単にそれらを保存し、それをするために使用THERの方法を使用して保つためにダミー変数を使用することになり、あなたが逆の操作を行うと仮定したキーワードを追加します。
3)私は多くの人々が実際に戻り値がオプションであるか否かを熟考する時間がかかるだろうとは思いません。いくつかのケースでは、私はそれが与えられています認めるようになった、常にではありません。
メソッドDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value)
を考えてみましょう:キーが辞書にある場合、それはチェックし、それがあれば、それはout
パラメータに値を入れます。戻り値は、操作が成功したかどうかを示すbool
あります。時には、あなたは気に。時々、あなたはしないでください。私がこのような方法のためにかなり受け入れられたアプローチだと思います。コンパイラは変数に戻り値を割り当てることができ強制あれば、人々はこのようなコードの多くを持つことになります:
int someValue = 0;
bool discard = IntDictionary.TryGetValue("key", out someValue);
// I don't even care if discard is true or false;
// someValue will be 0 if it wasn't in IntDictionary
私は
により数回かましてきました
の結論に、しないことにより、ジャンプ
VB.NETで文...実際には何もしないことを...
が、それは実際には非常によく文書化されます。