質問

ほとんどの場合、私たちは決して 0 より小さくならない概念を表します。たとえば、長さを宣言するには、次のように書きます。

int length;

名前はその目的をよく表していますが、負の値を割り当てることができます。場合によっては、代わりに次のように記述することで、意図をより明確に表現できるようです。

uint length; 

私が考えることができるいくつかの欠点は次のとおりです。

  • 符号なし型 (uint、ulong、ushort) は CLS に準拠していないため、これをサポートしていない他の言語では使用できません。
  • .Net クラスはほとんどの場合署名付き型を使用するため、キャストする必要があります。

考えは?

役に立ちましたか?

解決

「ローマにいるときはローマ人に倣え。」

理論的には、コードの表現力が高まるため、該当する場合に符号なしの値を使用すると利点がありますが、C# ではこれが行われません。なぜ開発者が最初に処理するインターフェイスを設計しなかったのかわかりません uints タイプを CLS に準拠させますが、列車は駅を出発しました。

一般に一貫性が重要であるため、C# の道を選択し、次を使用することをお勧めします。 ints.

他のヒント

値 0 の符号付き数値をデクリメントすると負になるため、これを簡単にテストできます。値 0 の符号なし数値をデクリメントすると、アンダーフローが発生し、その型の最大値になります。これは、チェックがやや難しくなります。

2 番目の点が最も重要です。一般的には、単に使用する必要があります int これは整数値の非常に優れた「キャッチオール」であるためです。私はただ使います uint より高い数を数える能力がどうしても必要な場合 int, ただし、余分なメモリは使用しません long 必要です (メモリはそれほど多くないので、安っぽくならないでください:-p)。

uint vs. の微妙な使い方だと思います。int は、会社の開発者ガイドラインに記載されていない限り、開発者に混乱を引き起こす可能性があります。

たとえば、長さをゼロ未満にすることができない場合は、将来の開発者がコードを読んで真の意図を知ることができるように、ビジネス ロジックで明確に表現する必要があります。

私の2セントだけです。

C# ではオンにできることを指摘しておきます。 /checked 算術オーバーフロー/アンダーフローをチェックするためですが、いずれにせよ悪い考えではありません。クリティカルセクションでパフォーマンスが重要な場合でも、引き続き使用できます。 unchecked これを避けるために。

内部コード (つまり、他の言語との相互運用マナーで参照されないコード) については、状況に応じて unsigned を使用することに投票します。 length 前述したように変数。これは、演算チェックと併せて、開発者にもう 1 つの網を提供し、微妙なバグを早期に発見します。

署名付きか署名なしかの議論のもう 1 つのポイントは、一部のプログラマーは、本来意味を持たない -1 などの値をエラーを示すために使用することです。私は、各変数の目的は 1 つだけであるべきだという意見に同意しますが、あなたや一緒にコードを書く同僚がこの方法でエラーを示したい場合は、変数に署名を付けたままにしておくと、後でエラー状態を柔軟に追加できます。

あなたの2点は良いです。ただし、それを避ける主な理由はキャストです。キャストすると、使用するのが非常に面倒になります。一度、符号なし変数を使用してみましたが、フレームワークのメソッドはすべて符号付き整数を使用しているため、あらゆる場所にキャストを散りばめる必要がありました。したがって、フレームワーク メソッドを呼び出すときは常にキャストする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top