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

わんくま同盟

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

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


(過去ログ 106 を表示中)
■63514 / )  Re[6]: Brushesのカラーコードを変数に出来ませんか?
□投稿者/ shu (58回)-(2012/09/03(Mon) 23:01:22)
No63511 (魔界の仮面弁士 さん) に返信

> >>if CBool(e.State And DrawItemState.Selected) = False Then
>>Integer And Integer の値はIntegerであってBooleanではないので
>>このような意味が分かりにくい変換をすべきではないと思います。
>
> Boolean ではないからこそ CBool しているのだと思いますよ。
>
> 〜 公式のサンプル 〜
>
CBoolはBoolean型への変換を行う関数であって
=0ならFalse
<>0ならTrue
にするというのが目的の関数ではないはず。たまたま互換性のため
そうしているがBooleanというのは真偽を表すための型であり全てのビットがoff、または
どれかのビットがonになっている状態を表すための型としての使い方は保障されるものでは
ない気がします。実質的には変更されることはないのでしょうけど。


> しかしその一方で、先の No63504
>>(e.State And DrawItemState.Selected) > 0
> という書き方は避けるようにしています。マスクが符号付の型である場合は特に。
>
> 確かに > 0 で判定されているサンプルもあるのですけど、
> 「= 0」の反対を「> 0」とすることに私は違和感を覚えるため、
> 整数比較を採用する場合は「(X And Mask) > 0」と書くのではなく、
> 代わりに「(X And Mask) <> 0」と書くようにしています。

確かに>0は符号付の事を考えると汎用性に欠けていたかもしれません。
「(X And Mask) = Mask」、「(X And Mask) <> 0」の条件で書いた方が確実ですね。
前者はMaskのすべてのビットを含む場合、後者はどれか1ビットでも含めばいい場合ですね。


>
> これが .NET 4 なら、「HasFlag メソッドを使う」という案もありますが、
> あれは引数が汎用の Enum 型なので、あまり好きでは無かったり。
返信 編集キー/


管理者用

- Child Tree -