C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 106 を表示中)
■63529 / )  Re[1]: CBoolについて(#63492スレ:63519より分岐)
□投稿者/ 魔界の仮面弁士 (51回)-(2012/09/04(Tue) 14:43:08)
No63521 (shu さん) に返信
> 理解していただきありがとうございます。

shu さん的には、下記の因数判定関数(IsFactor)の実装も NG であろうかと予測します。
http://msdn.microsoft.com/ja-jp/library/cc344148.aspx

もしこれが、奇数判定(IsOdd)の場合はどうでしょう?
Mod 2 なら、答えは 0 / 1 の二値になりますが…。


ちなみに自分の場合は、どちらも CBool を使わずに実装します。
もしも後輩が書いているのをみた場合、後者はスルーしますが、
前者は、次回からは別の書き方にするように指導するかも知れません。



>>>何を Boolean 型に変換する事を目的としているのでしょう。
>>
>> この質問に対する答えもお聞きしたいです。
>> 
> 変換元の集合がTrue,Falseに対し1:1で対応していて

1 対多の場合は使用するべきでは無く、
1:1 となる場合にのみ使用するべき、という話ですね。

・「True なもの、False なもの、どちらでも無い物」に分かれる集合は除外される。
・「True なもの/False なもの」だけの集合であっても、
 True / False それぞれを表す表現が複数あった場合は除外される。

データ型に着目して考えてみた場合は、

・String 管理されたデータを変換する場合は、
 Boolean.TrueString / Boolean.FalseString の二値の場合のみ使用する。

・整数型の場合は、「0」と「0以外の特定の1つの数値」の場合に限定して利用。
 たとえば 0 / 1 や 0 / -1 や 0 / 9 などで使用するのは良いが、
 0 / 1〜9 などのパターン(No63518 など)では使用しない。

という認識でよろしいでしょうか。

# 実数型の場合は、今回触れていなかったので考慮外。
# Decimal のように、0 と 0.00 とで別のバイナリになる場合もあるので、
# 下手に触れるとややこしいことになりそう。(^^;


上記のとおりだとしたら、「e.State And DrawItemState.Selected」の結果は、
DrawItemState.None / DrawItemState.Selected のどちらか二値である
という見方をすることで許容されそうにも感じますが、これは不味いのでしょうか。



> Cboolでの変換で思ったとおりに変換が出来るときに使用することを
> 目的としていると思います。
こちらは、誰にとっての「思ったとおり」でしょうか?

ある開発者が「予想」した変換規則があって、それと同様の
動きを見せた場合に使うべき、という話でしょうか。
(開発者Aと開発者Bの「思ったとおり」は、異なるかもしれません)



> Object型にBox化されたBoolean値をUnBox化するときに使うのが良いのではないでしょうか?
私は逆に、ボックス化解除の目的では CBool を使いたく無い派です。

IL 的には unbox だけで済む処理が、わざわざ VB の変換サービスを
通すことになってしまいますので、そのような場合には
型変換(CBool / CType)ではなくキャスト(DirectCast / TryCast)を好みます。


ただ、それだと読みづらいという意見が出たこともあるので、多少の
パフォーマンス劣化は無視して、あえて CBool を使う事はありますけれども。


> 演算結果のBoolean値を使った方が確実
私も基本的にはその認識です。


> (明確な仕様がFrameworkレベルで定められればCBoolの方が確実ですが)
CBool は言語固有実装なので、Framework 側では定義されないでしょうね。
(VB の仕様については、先述したとおり)

.NET Framework の場合は、
 Convert.ToBoolean(Int32) →0 は False、それ以外は全て True。
が明文化されていますね。

IL レベルでは、native int の 0 は false 、それ以外は true です。
If 文相当の条件分岐としては、
 0x39(brfalse / brnull / brzero) → 0 ならばジャンプ
 0x3A(brtrue / brinst ) → 0 以外ならばジャンプ
が用意されています。

返信 編集キー/


管理者用

- Child Tree -