1

私は、C# でかなり低レベルのアプリケーションを作成しており、多くのバイト ショートとビット操作を使用しています。私が気づいたことの 1 つは、C# がビット操作を行い、int 以外にブール演算子を使用することを好まないことです。これにより、コード全体で何百ものキャストが発生しました。「タイプ 'int' を 'ushort' に暗黙的に変換できません。明示的な変換が存在します (キャストがありませんか?)」などのエラー

byte b1 = 0x22;
byte b2 = 0x33;
ushort s1 = b1 << 8; // <-- Error Here
ushort s2 = s1 | b2; // <-- And Here

これにより、どこでもキャストを使用する必要があります。

byte b1 = 0x22;
byte b2 = 0x33;
ushort s1 = (ushort)(b1 << 8 | b2);

これはせいぜい警告です。b1 と b2 が ushort 型の場合でも、エラーになります。加算などの基本的な演算でも同じエラーが発生します。

ushort s1 = 0x22;
ushort s2 = s1 + 0x11; // <-- Oh Come On.
ushort s3 = 8;
ushort s4 = (s1 << s3 | s2); // <-- Still an Error.

とにかくこれについてはありますか、それとも、整数以外のものを使用する場合、またはこれが問題ではない場合に C++ を使用する場合、キャストは C# の生活の一部にすぎないという事実に自分自身を辞任する必要がありますか?

4

2 に答える 2

3

デバッガーでネイティブ コードを見ると、この演算のほとんどすべてが int として行われていることがわかります。最善の方法は、ローカルに int を使用し、値をデータ構造にコピーするときにのみキャストすることで、これをコードに反映することであるという結論に達しました。

于 2011-10-11T01:57:57.460 に答える
1

残念ながら、これを回避する方法はありません。これは、言語がどのように設計されたかにすぎません (実際には、言語よりも深く、すべてのビット単位のロジックが Int32 データ型として実行されるCLRに入ります)。

キャストを続けたり、ラッパー関数/クラスを作成したり、安全でない/C++ コードに切り替えてそこで実行したりできます。

于 2011-10-11T01:56:45.733 に答える