質問
ほとんどの場合、私たちは決して 0 より小さくならない概念を表します。たとえば、長さを宣言するには、次のように書きます。
int length;
名前はその目的をよく表していますが、負の値を割り当てることができます。場合によっては、代わりに次のように記述することで、意図をより明確に表現できるようです。
uint length;
私が考えることができるいくつかの欠点は次のとおりです。
- 符号なし型 (uint、ulong、ushort) は CLS に準拠していないため、これをサポートしていない他の言語では使用できません。
- .Net クラスはほとんどの場合署名付き型を使用するため、キャストする必要があります。
考えは?
解決
「ローマにいるときはローマ人に倣え。」
理論的には、コードの表現力が高まるため、該当する場合に符号なしの値を使用すると利点がありますが、C# ではこれが行われません。なぜ開発者が最初に処理するインターフェイスを設計しなかったのかわかりません uints
タイプを CLS に準拠させますが、列車は駅を出発しました。
一般に一貫性が重要であるため、C# の道を選択し、次を使用することをお勧めします。 int
s.
他のヒント
値 0 の符号付き数値をデクリメントすると負になるため、これを簡単にテストできます。値 0 の符号なし数値をデクリメントすると、アンダーフローが発生し、その型の最大値になります。これは、チェックがやや難しくなります。
2 番目の点が最も重要です。一般的には、単に使用する必要があります int
これは整数値の非常に優れた「キャッチオール」であるためです。私はただ使います uint
より高い数を数える能力がどうしても必要な場合 int
, ただし、余分なメモリは使用しません long
必要です (メモリはそれほど多くないので、安っぽくならないでください:-p)。
uint vs. の微妙な使い方だと思います。int は、会社の開発者ガイドラインに記載されていない限り、開発者に混乱を引き起こす可能性があります。
たとえば、長さをゼロ未満にすることができない場合は、将来の開発者がコードを読んで真の意図を知ることができるように、ビジネス ロジックで明確に表現する必要があります。
私の2セントだけです。
C# ではオンにできることを指摘しておきます。 /checked
算術オーバーフロー/アンダーフローをチェックするためですが、いずれにせよ悪い考えではありません。クリティカルセクションでパフォーマンスが重要な場合でも、引き続き使用できます。 unchecked
これを避けるために。
内部コード (つまり、他の言語との相互運用マナーで参照されないコード) については、状況に応じて unsigned を使用することに投票します。 length
前述したように変数。これは、演算チェックと併せて、開発者にもう 1 つの網を提供し、微妙なバグを早期に発見します。
署名付きか署名なしかの議論のもう 1 つのポイントは、一部のプログラマーは、本来意味を持たない -1 などの値をエラーを示すために使用することです。私は、各変数の目的は 1 つだけであるべきだという意見に同意しますが、あなたや一緒にコードを書く同僚がこの方法でエラーを示したい場合は、変数に署名を付けたままにしておくと、後でエラー状態を柔軟に追加できます。
あなたの2点は良いです。ただし、それを避ける主な理由はキャストです。キャストすると、使用するのが非常に面倒になります。一度、符号なし変数を使用してみましたが、フレームワークのメソッドはすべて符号付き整数を使用しているため、あらゆる場所にキャストを散りばめる必要がありました。したがって、フレームワーク メソッドを呼び出すときは常にキャストする必要があります。