■63530 / ) |
Re[2]: CBoolについて(#63492スレ:63519より分岐) |
□投稿者/ shu (63回)-(2012/09/04(Tue) 15:48:04)
|
■No63529 (魔界の仮面弁士 さん) に返信
> shu さん的には、下記の因数判定関数(IsFactor)の実装も NG であろうかと予測します。 > http://msdn.microsoft.com/ja-jp/library/cc344148.aspx > > もしこれが、奇数判定(IsOdd)の場合はどうでしょう? > Mod 2 なら、答えは 0 / 1 の二値になりますが…。 Mod 2の答えは余りでありTrue,Falseを表すものではないのでNGです。
> > >>>何を 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 のどちらか二値である > という見方をすることで許容されそうにも感じますが、これは不味いのでしょうか。 見方としてNone(=0)をFalseに対応させ、SelectedをTrueに対応させる ということが出来なくはないですが、そう考えてしまうと A And Maskの結果が論理上、 Integerになったり (Maskが2つ以上のフラグ(B or Cなど)の値である場合) Booleanになったり (Maskが1つのフラグである場合) してしまい分かりにくくなるということになります。 ※Booleanになるというのは前述した1:1の関係を保ちつつBooleanへの変換が可能なことを 言うとします。
>>Cboolでの変換で思ったとおりに変換が出来るときに使用することを >>目的としていると思います。 > こちらは、誰にとっての「思ったとおり」でしょうか? > > ある開発者が「予想」した変換規則があって、それと同様の > 動きを見せた場合に使うべき、という話でしょうか。 > (開発者Aと開発者Bの「思ったとおり」は、異なるかもしれません) プロジェクト内での仕様で考えればよいと思います。
>>Object型にBox化されたBoolean値をUnBox化するときに使うのが良いのではないでしょうか? > 私は逆に、ボックス化解除の目的では CBool を使いたく無い派です。 > > IL 的には unbox だけで済む処理が、わざわざ VB の変換サービスを > 通すことになってしまいますので、そのような場合には > 型変換(CBool / CType)ではなくキャスト(DirectCast / TryCast)を好みます。 > > > ただ、それだと読みづらいという意見が出たこともあるので、多少の > パフォーマンス劣化は無視して、あえて CBool を使う事はありますけれども。 私もどちらかというとDirectcastを使うようにはしています。
>>(明確な仕様が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 以外ならばジャンプ > が用意されています。 仕様としてはFalseを0に対応付けするのはいろいろ内部処理上都合がよいので 変わることはないでしょうね。
|
|