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

わんくま同盟

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

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


(過去ログ 106 を表示中)
■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に対応付けするのはいろいろ内部処理上都合がよいので
変わることはないでしょうね。
返信 編集キー/


管理者用

- Child Tree -