2011-05-30 15 views
4

hereによれば、答えの1つは、C#からVB.NETへのコード変換を使用して、intに適用された演算子++をSystem.Math.Max(System.Threading.Interlocked.Increment(current),current - 1))に置き換える必要があり、私はこれが実際に正しいかどうか疑問に思いましたか?VB ++の演算子++ Interlocked.Increment

もしそうなら、それはなぜ正しいですか?私は演算子++がInterlocked.Increment演算として実装されるとは思わなかったのですか?私はスレッドセーフだとは思わなかった。私はこれらの2つが同じであることを知りません。そして、なぜ質問に答えて、働くことさえできますか?

私はそれを試みましたが、正しい結果が得られました。 AFAIK、.NETにはC++のように未定義の動作はありません。

誰かが明確にできますか?

+0

私は他の質問で答えを提供した人でした。参考のために:私は[telerikのコンバータ](http://converter.telerik.com/)を使用しました。 –

+0

@Daniel:ありがとうございました:) –

+0

あなたは書かれているので、interlocked.incrementを使う必要はありません – Deepesh

答えて

3

VB.Netでx += 1を実行できます。 x ++ほどエレガントではありませんが、x = x + 1よりも優れています。

Interlocked.Incrementは、追加操作をスレッドセーフにするためのものです。それはまったく必要ないかもしれません。

EDIT:それは明確ではなかった場合も、VBには++演算子がありません、私はなぜ得ることはありませんが、うまく...

+0

VBでは "++"がない理由は、x + = 1を使うことができるからです。VB C/C++が便利に使うことができるWithステートメントの場合を除いて、ソースコードの簡潔さは主要な関心事ではありません(C/C++が句読点としてレンダリングしていないものすべてを参照してください)。 – AAT

+0

ポストインクリメント/デクリメントだけでなく、プリインクリメント/デクリメントも許可すると、++が便利な場合があります。 – Neverbirth

+0

x + = 1はx ++とはまったく異なります。後者は値を返します。 ++には本当の価値はなく、言葉を不必要に複雑にすることを除けば、 –

3

C#演算子++は、インターロックされたセマンティクスを使用しません。これはx=x+1に相当します。

1

いいえ、それはcurrent++のための適切な交換ではありませんので、 current++current(ポストインクリメント)の不変の値を返し、

System.Math.Max(System.Threading.Interlocked.Increment(current),current - 1)) 

インクリメント値(プリインクリメント)を返しています。

私はこの同じコードをVB#http://www.developerfusion.com/tools/convert/csharp-to-vb/のVBコンバータに持っていて、その違いがプログラムの動作を変更しました。