1

自己参照しているように見える 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 を悩ませているようには見えません。IDE/コンパイラがこの影響について警告しない、または例外「Statement DoestDoAnything」がスローされない理由はありますか? コードは何も変更しないように作成されているため、明らかに入力ミスです。

4

8 に答える 8

4

はい、副作用のないメソッドを何らかの [NoSideEffectsAttribute()] でマークして、コンパイラなどのツールが警告できるようにできれば素晴らしいと思いますが、現時点ではそのようなことはわかっていません。

しかし、FxCop を試すこともできます。.NET アセンブリの微妙なプログラミング エラーを多数見つけることができます。

于 2009-11-20T18:20:34.307 に答える
3

一部の関数は何らかの副作用を起こし、値を返すため、戻り値を無視することが意図されていないことを伝えるのは難しい場合があります。

「単に」値を返す関数は、コンパイラーにチェックさせるためにそのようにマークする必要があり、それは優先事項ではなかったか、投資に対して十分な利益があると判断されていませんでした (明らかに、そうでなければ、彼らはそれを行っていたでしょう:) .

于 2009-11-20T18:21:10.673 に答える
2

メソッドがプログラマーによってオプションで処理される値を返す多くのインスタンスがあります。この特定のメソッドが何もしないことをコンパイラが知る方法はありません。副作用がある可能性があり、メソッドの戻り値で何もしないことを選択したという事実は、あなたの側で意識的に決定する必要があります。

コンパイラがこれが発生したすべてのインスタンスについて警告することを選択した場合、誤った警告が多すぎます。

于 2009-11-20T18:17:43.610 に答える
1

関数が「何かを行う」かどうかをコンパイラが判断するのは、しばしば困難です。コンパイラは、厳密な手続き間分析 (IPA) を行わない限り、関数呼び出しに副作用があるかどうかを判断できません。

IPA は低速なプロセスであり、コンパイラのメモリ要件が大幅に増加するため、デフォルトではほとんどのコンパイラはこれを実行しません。

于 2009-11-20T18:27:54.867 に答える
0

メソッドを検討してください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
于 2009-11-20T18:33:22.223 に答える
0

これは C、C++ から継承された動作であり、元々は関数/メソッドからの戻り値を使用するかどうかを選択できるように行われていました...一連の処理を実行してから戻る関数/メソッドを作成する場合何らかの値を呼び出すと、書き込むオプションがあります

variableName = functionName([parameterlist]);  

何かでreturnb値を使用したい場合、または単に

functionName([parameterlist]);  

そうしないと。

あなたが言及したような副作用のない関数メソッドの場合、これはあまり意味がありませんが、新しい言語に変更すると、この標準に準拠する他の多くの言語の長い歴史に反することになります...

于 2009-11-20T18:23:57.487 に答える
0

さまざまな理由で、戻り値を変数に入れるかどうかを強制するためのさらに別のキーワードを使用することが良い考えであるかどうかはわかりません

1 ) 戻り値がオプションの場合にキーワードを追加するとします (したがって、通常は必須であることを意味します)。これにより、多くのコードがコンパイルを停止したり、大量の警告を発行したりします。

2) 逆に、戻り値が強制されるときにキーワードを追加するとします。一部の人々は単にダミー変数を使用してそれらを格納し、以前の方法で使用し続けます。

3) 多くの人が実際に戻り値がオプションかどうかを熟考するのに時間がかかるとは思いません。場合によっては、それが与えられていることを認めなければなりませんが、常にではありません。

于 2009-11-20T18:26:19.817 に答える
-1

何度か噛まれました

ではなく、結論に飛びつく

VB.NET のステートメント ... それ ... 実際には何もしません

しかし、それは実際には非常によく文書化されています。

于 2009-11-20T18:26:31.707 に答える