こんにちは。c#初心者です。
よくインデックスなどで引数が負数でないかのチェックを行いますが、その代わりに引数を符号なし整数、例えば「uint」にしてしまうというのはどうなのでしょうか?
初心者から見た長所は負数のチェックを行うより「int」から「uint」へのキャストのほうがやや高速(とはいっても全体的なパフォーマンスへの影響は薄い)。利用側が、負数がダメだと”やや”わかりやすくなる。
短所は「checked」がないと負数でオーバーフローを起こしても放置されること。(uint)が至る所に発生してむしろ可読性が下がるかもしれないことと、面倒になること(これは大きいかもしれない)。
(負数のチェックだけでなく上限のチェックが必要な場合は「int」、「uint」かかわらずチェックするので「uint」だからといって超えすぎる心配はなく、その場合、オーバーフローも間接的に例外として検出される)
という感じなのですが、なにせ初心者なわけで、皆さんのご意見をうかがわせてもらえませんか?
No.4ベストアンサー
- 回答日時:
> こういうのはどうなのでしょう?
uintとintの比較は出来ないので両方ともuintにキャストしなきゃなりませんが、そこまでして負数チェックをしたくないんでしょうか?
つーかC#使ってる時点でこんな細かすぎる速度最適化は考えない方がいいと思いますけど。
回答ありがとうございます。
> そこまでして負数チェックをしたくないんでしょうか?
前記の通り、飽くまで気になっただけです。
> uintとintの比較は出来ないので
ということは「if ( count <= (uint)index )」(countはint型)でコンパイルエラーが出なかったので暗黙の型変換がかかっているということでしょうか? 僕の記憶では暗黙の型変換はできかかったと思うのですが。
> C#使ってる時点でこんな細かすぎる速度最適化は考えない方がいい
まあ、計算量を減らすことが先決ですよね。
No.3
- 回答日時:
> 短所は「checked」がないと負数でオーバーフローを起こしても放置されること。
(uint)が至る所に発生してむしろ可読性が下がるかもしれないことと、面倒になること(これは大きいかもしれない)。コレに関しては、更に致命的な弊害である「型エラーが出ているところを何も考えずにキャストする習慣を生みかねない」ということを指摘しておきましょう。まぁC#だと全く無関係な型の間でのキャストは不能ですが。
#2でも言われてますが、大抵のインデクサは引数がintなのだから同様にしておくべきでしょうね。
回答ありがとうございます。
> #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");
……//処理
}
}
_______________________/
見かけ上の引数の型は保たれるので、外部から使用する分に関しては問題ないかと思うのですがどうなのでしょうか? 時間がありましたらどなたでも良いのでご意見ください。
No.2
- 回答日時:
> に置き換えることは可能か? ということです。
可能かと聞かれれば、可能ですと答えます
が、たぶん私はやりません
統一性にかけるからです
IList<T> にも、IndexOfメソッドはありますよね
発見できない場合どうするのでしょうか?
会社の同僚が VBで作成したクラスに、
Count プロパティがあり使用してみたら
Count -1 の値が返されていて( For i=1 To xxx.Count とかしたかったらしい)
トラブルの原因になった経験がある私としては、
共通事項として浸透しているものは変えない方が
不具合の軽減になると思いますよ
No.1
- 回答日時:
普通インデックスが負数になるという事は、選ばれていないという合図として
処理しませんか?
たとえば、
IndexOf メソッドは配列を検索し、発見できればそのインデックス番号を、
発見できなければ -1 を返します。
コンボボックスのリスト等は、選択された行があれば、そのインデックス番号、
選択されていなければ -1 を返します
発見できなかった/選択されなかった場合の処理を行う事の方が重要だと思います
エラーな物を強制的に uintにして、その後の動きが意味不明になる方法を取る
事の方がおかしいと思います
この回答への補足
> 普通インデックスが負数になるという事は、
> 選ばれていないという合図として
> 処理しませんか?
無論、いくつかの戻り値や、比較的少ないですが引数では「-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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ニュース・時事問題) コロナ感染者「全数把握」の廃止? 6 2022/08/17 22:22
- FX・外国為替取引 FX取引をされている方に質問です。 【このところのFX相場は、難しいのでしょうか?】 昨年春よりFX 3 2023/07/21 20:40
- その他(社会・学校・職場) 業務内容についてどう思いますか? 私は客先の仕事を下請けとして行うという仕事をしていますが、(客先の 2 2022/05/04 16:17
- その他(社会・学校・職場) 業務内容についてどう思いますか? 私は客先の仕事を下請けとして行うという仕事をしていますが、(客先の 3 2022/05/04 17:55
- 分譲マンション 総会前にきて、管理会社のフロントマンに振り回され役員一同が困っています。 5 2023/05/15 03:12
- YouTube 「Youtubeは任天堂のファミコン商法を見習え」という意見は正しいか? 1 2023/06/06 13:07
- 政治 日本もラウンドアバウト交差点を増やすべきではないですか? 4 2023/06/26 23:27
- 外国株 インデックス投資は、実は罠がある、バンガード社が、ウオール街の ランダムウオーカーとか、宣伝活動した 2 2023/01/06 22:08
- 政治 安倍自公政権のアベノミクスとやらで、日本が経済成長し、景気・内需も良くなった? 2 2022/05/04 10:30
- 夫婦 妻のスマホを定期的にチェックする夫 8 2023/01/14 18:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.NETで16進数が正しいかどう...
-
ファイルダイアログを開いた時...
-
文字列からダブルクオートの削除
-
時間の取得
-
Timestamp型への変換について(J...
-
【JAVA】与えられた金額を貨幣...
-
全角スペースのチェックについて
-
プロポーショナルフォントで文...
-
c# チェックか符号なしか
-
String型の日付(2005/11/25)の...
-
VB.Net Object型 空かどうか
-
0除算の例外処理ができない!!...
-
VBA Evaluate関数 型が一致しま...
-
タトゥーや墨を入れる人の共通点
-
C#の捕捉されない例外処理の対...
-
java 文字列の部分一致について
-
CreateEventについて
-
プログラムが作動してくれませ...
-
次の日本語の意味を教えて下さい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
Timestamp型への変換について(J...
-
連続する「\\」をひとつの「\\...
-
VB.NETで16進数が正しいかどう...
-
全角スペースのチェックについて
-
C# マルチスレッドにおける例外...
-
文字列からダブルクオートの削除
-
VBA Evaluate関数 型が一致しま...
-
例外ってIf文の中に入れますか...
-
C#の捕捉されない例外処理の対...
-
時間の取得
-
【JAVA】与えられた金額を貨幣...
-
nullで、return出来るのはどん...
-
String型の日付(2005/11/25)の...
-
サーブレットからJSPの呼び出し...
-
0除算の例外処理ができない!!...
-
VBA 400エラー 1004エラー
-
文字列が数字のみで構成されて...
-
数字か文字列かを判定する関数
おすすめ情報