• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c# チェックか符号なしか)

C#チェックか符号なしか

このQ&Aのポイント
  • C#初心者が「int」から「uint」へのキャストを使用して引数のチェックを行う方法についての質問です。
  • キャストによる負数のチェックは負数よりもわかりやすいが、オーバーフローの問題や可読性の低下が懸念されます。
  • C#の上限チェックは「int」または「uint」に関係なく行う必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

> こういうのはどうなのでしょう? uintとintの比較は出来ないので両方ともuintにキャストしなきゃなりませんが、そこまでして負数チェックをしたくないんでしょうか? つーかC#使ってる時点でこんな細かすぎる速度最適化は考えない方がいいと思いますけど。

koumei000
質問者

お礼

 回答ありがとうございます。 > そこまでして負数チェックをしたくないんでしょうか?  前記の通り、飽くまで気になっただけです。 > uintとintの比較は出来ないので  ということは「if ( count <= (uint)index )」(countはint型)でコンパイルエラーが出なかったので暗黙の型変換がかかっているということでしょうか? 僕の記憶では暗黙の型変換はできかかったと思うのですが。 > C#使ってる時点でこんな細かすぎる速度最適化は考えない方がいい  まあ、計算量を減らすことが先決ですよね。

その他の回答 (3)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

> 短所は「checked」がないと負数でオーバーフローを起こしても放置されること。(uint)が至る所に発生してむしろ可読性が下がるかもしれないことと、面倒になること(これは大きいかもしれない)。 コレに関しては、更に致命的な弊害である「型エラーが出ているところを何も考えずにキャストする習慣を生みかねない」ということを指摘しておきましょう。まぁC#だと全く無関係な型の間でのキャストは不能ですが。 #2でも言われてますが、大抵のインデクサは引数がintなのだから同様にしておくべきでしょうね。

koumei000
質問者

お礼

 回答ありがとうございます。 > #2でも言われてますが、 > 大抵のインデクサは引数がintなのだから同様にしておくべきでしょうね。  これについても投稿した後になって思いついたのですが、こういうのはどうなのでしょう? (本当に殆ど速度は変わらなかったので何のこだわりもないのですが気になったので一応)  以下「count」を「private」な負数でない「int」型整数とする。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ public class List<T> : IList<T> {   public T this[int index]   {   get     {       if ( count <= (uint)index )         throw new ArgumentOutOfRangeException("index");       ……//処理     }   set     {       if ( count <= (uint)index )         throw new ArgumentOutOfRangeException("index");       ……//処理     } } _______________________/  見かけ上の引数の型は保たれるので、外部から使用する分に関しては問題ないかと思うのですがどうなのでしょうか? 時間がありましたらどなたでも良いのでご意見ください。

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.2

> に置き換えることは可能か? ということです。 可能かと聞かれれば、可能ですと答えます が、たぶん私はやりません 統一性にかけるからです IList<T> にも、IndexOfメソッドはありますよね 発見できない場合どうするのでしょうか? 会社の同僚が VBで作成したクラスに、 Count プロパティがあり使用してみたら Count -1 の値が返されていて( For i=1 To xxx.Count とかしたかったらしい) トラブルの原因になった経験がある私としては、 共通事項として浸透しているものは変えない方が 不具合の軽減になると思いますよ

koumei000
質問者

お礼

 回答ありがとうございます。  Countが-1を返すのは初耳です。仕様によってはそういうこともありうるのですね。覚えておきます。

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.1

普通インデックスが負数になるという事は、選ばれていないという合図として 処理しませんか? たとえば、 IndexOf メソッドは配列を検索し、発見できればそのインデックス番号を、 発見できなければ -1 を返します。 コンボボックスのリスト等は、選択された行があれば、そのインデックス番号、 選択されていなければ -1 を返します 発見できなかった/選択されなかった場合の処理を行う事の方が重要だと思います エラーな物を強制的に uintにして、その後の動きが意味不明になる方法を取る 事の方がおかしいと思います

koumei000
質問者

補足

> 普通インデックスが負数になるという事は、 > 選ばれていないという合図として > 処理しませんか?  無論、いくつかの戻り値や、比較的少ないですが引数では「-1」などを整数の数少ない特別な状態の表現方法の1つとしてありがたく使わせてもらっています。 > エラーな物を強制的に uintにして……(以下略)  国語力が多分平均以下のこちらにも落ち度があったと思いますが、質問の意図を汲んでもらえなかったので補足です。  僕が言葉を連ねてもまた意図が伝わらなさそうなので具体例を挙げます。  以下、「count」を静的でない「int」型のフィールド変数とします。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ public class List<T> : IList<T> {   public T this[int index]   {   get     {       if ( index < 0 || count <= index )         throw new ArgumentOutOfRangeException("index");       ……//処理     }   set     {       if ( index < 0 || count <= index )         throw new ArgumentOutOfRangeException("index");       ……//処理     } } _______________________/ を  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ public class List<T> : IList<T> {   public T this[uint index]   {   get     {       if ( count <= index )         throw new ArgumentOutOfRangeException("index");       ……//処理     }   set     {       if ( count <= index )         throw new ArgumentOutOfRangeException("index");       ……//処理     } } _______________________/  に置き換えることは可能か? ということです。  上記は飽くまで例えなので、「この場合は無理」、「この場合はOK」などありましたらご指摘ください。

関連するQ&A