2009-06-03 10 views
33

C#では、boolをint型にキャストできないことはすべて知っています。私はビットマスクを使って真のバイナリ表現を見たいと思っていましたが、(bool & int)を使用することはできません。問題はアーキテクチャの欲望であると思います。 "真は真であり、数字ではありません!= 0"(C++)このようなアーキテクチャのメリットが何か不思議でした。 C true/falseのコンセプトには何が悪いですか?C#はboolをint型にキャストできません

+2

([ "?タイトルに『タグ』の質問には、すべき"]を参照してくださいhttp://meta.stackexchange.com/questions/19190/should-questions-should-its-titles-that-their-titles)、コンセンサスは「いいえ、彼らはすべきではありません」です! –

答えて

26

trueまたはfalseに整数を使用できない場合は、プログラマには明らかです。

if (5 > 0)は、それは彼らがswitch文に条件を落下許可しない理由と同じ理由です理解しやすいのではなくif(5)

です。間違いをするのは簡単すぎる。

+10

私は実際にはC#のLOTのswitch文を使って落とす方法を嫌っています。転倒が非常に有益であるケースがたくさんあります。 – Joseph

+5

@Joseph:エラーが起こりにくいケースはまだ許されています。まず作業をしなければ落ちることがあります。しかし、他の "仕事"をした後に事件が起こることは容易に維持できません。 –

+1

@Joseph:有用であるということは、エラーを起こしやすいというわけではなく、間違いを起こしやすいということではありません。 –

15

情報だけのために、Convert.ToInt32(fooBool)は(ただし、これはBCLの任意の表現であり、必ずしも1がメモリを使用していました。)trueが1で表されることを教えてくれ、と0によってfalseすべき

ここでのポイントは、ビット表現は実際にはどのプログラマにとっても無意味であるべきだということです。ブール値は特定の目的(フラグなど)で使用するためのものであり、intと混同しないようにしてください。そうしないと、変数の使用がかなり混乱する可能性があります。

-2

ナンバー!= 0、あまりにもエラーが発生しやすいです。

C#このような一般的な間違いを覆すために多くの設計上の決定を下しました。

+0

あなたのポイントは何か分かりません。たぶんあなたはもう少し詳しく説明することができます。 – jpierson

+0

if (27)のようなものを許可しないと、より信頼性の高い構文の方に言語が人々を強制します:if (27 > 0)

+0

ああ、私はここで、 "数字1 = 0"は元の投稿の直接の抜粋です。おそらくあなたの答えにもう少し文脈を置くことは、読者があなたの意見を理解するのに役立ちます。現状では、それ自体は意味をなさない。一般的には、あなたの答えに元の質問の何らかの形を持たせることが最善です。それは直接引用である必要はなく、元の質問の言い換えです。 – jpierson

3

誰もが他の事業体の意思決定のすべてを好きではない...ちょうどC整数では、独自のコンバータ(quick- & -dirtyのような)

21

を書き、頻繁に二重に通常の数と真偽値として使用されている、など特定の数がゼロでない間に実行されるforループ。

const char *s; 
for (s = str; *s; ++s) 
    ; 
return (s - str); 

が、そのスニペットの短い、それをマスク真の目的しばらく、私が探していた文字がある一方で、本質的に」ループを言う:それは明らかに、ナイーブはstrlenルーチンのような簡潔なコードのためにそのメリットを持って使用ですヌル文字ではありません "。しかし、書き留めておけば、「それが気に入ったらブール値として扱い、他の場合は数値として扱う」と書かれています。

ダブル自然のこの種のは、伝えられるところで頻繁に問題が生じると(あなたがintの特定の使用がintboolとして意図されているかどうかを文脈から判断する必要があるため)、それはコードが読みにくくなります。あなたは絶対に整数としてブール値を使用する必要がある場合

あなたはNoldorin mentionedとして

Convert.ToInt32(someBool) 

使用するか、明確にあなたが使用していると言うどちらも

someBool ? 1 : 0 

を使用して独自のロールバックすることができますいずれかintboolではなく)。

5

弱く型付けされた言語ではなく、強く型付けされた言語をC#にするという決定に関しては、真実/偽または1/0に関する多くの問題はないと思います。強く型付けされた言語には、多くの利点(およびいくつかの欠点)があります。利点の1つは、式の誤用(または誤った使用)によるバグを減らすことです。

例えば、

int i = 0; 
if (i = 1) { 
    ... 
} 

も、C#でコンパイルされませんが、それはC#、強く型付けされた言語は、これらの利点を推測するために選択C.

で正しくコンパイルおよび実行されます両方C#プログラマーたとえそうであっても、彼らは選択すればboolからint(そしてback)への変換を導入することができました。上記のようなバグの可能性があるため、そうしなかったのではないかと推測します。

+1

これは「強力なタイプ」とは関係ありません。 たとえば、Pythonは強く型付けされており、代入はステートメントですが、代入演算子は値を返します(つまり、a = b = c = 5を実行する場合に便利です)ので、if(i = 1)何も返さない。だから "if a = 3:if"のようなことをするのは誤りです。 しかし、python自体には "何でもブールの解釈があります"というルールがあります。空のコレクションは0、空の文字列はFalse、その他のものはTrueですので、実行できます mylist = [] mylistの場合: 何か – ZeD

+1

はい、このコンテキストで割り当ての結果を使用できる理由は、弱く型付けされているためです。ほとんど確かにその意図はi == 1です。これはブール結果であり、C#ではそのコンテキストで許可されます。 Cが強く型付けされている場合、C#のように、このコンテキストでは代入の結果は許可されません。そのままでは、割り当ての結果は(誤って、この場合)ブール値として自然に評価され、バグが生まれます。 – tvanfosson

-2

int n =(bBool)? 1:0

+2

これはキャストではありません –

+8

私はハンガリー記法、yukの使用のためにあなたを投票しなければなりません! – jpierson

-1

あなたはこれらについて良い点を挙げています。ただし、1つのショートカットは削除されます。

cでは、 "bBool = 1 - bBool"というコードで簡単に切り替えることができます。

bBoolがtrue(1)の場合、1 - 1 = 0です.bBoolはfalseに変わります。

bBoolがfalse(0)の場合、1 - 0 = 1です。bBoolがtrueに変わります。

代わりにC#で条件を調べて状態を確認し、それを逆にする必要があります。これはマシンと私にとってより多くの作業を引き起こします。

+16

何か不足していますか? 'bBool =!bBool;'あなたは何を説明しますか? – MarqueIV

4

我々はConvert.ToInt32を使用することができ、その定義はここにある:

public static int ToInt32(bool value); 
関連する問題