2016-11-01 4 views
1

私の質問がばかげていると申し訳ありません。C# - なぜObjectクラスにはtrue演算子がありませんか?

C++、このコードの動作では:C#ので

Foo* foo = new Foo(); 
if (foo) 
    ....; 
else 
    ....; 

、これは動作しません:

Object obj = new Object(); 
if (obj) 
    ....; 
else 
    ....; 

Objectクラスは暗黙のうちに、明白な(boolにそのことについては問題に変換することはできませんので、 )、それはtrueオペレータを実装していません。

私はなぜObjecttrue演算子を実装していないのですか(自分自身がヌルかどうかをチェックし、十分に簡単な音です)?それは単にコードの可読性などのためですか?

+0

私は、c/C++では、オブジェクトであるかどうかにかかわらず、 'obj'がnullでないことをテストしていると思います。例えば'if(somePointerToCharArray)'がc/C++コードでGuard演算子を等しく渡す – MickyD

+0

C++にブール型データ型がありません。 'if'は、整数値がゼロかどうかをチェックするだけです。 –

+0

@NiyokoYuliawan _ "C++にブール型のデータ型がありません" _ - 不正です。 http://stackoverflow.com/a/356728/585968 – MickyD

答えて

5

コードの明瞭さのためです。 C#の多くの設計上の選択肢は、コードが実行しようとしていることがすぐに分かるような方法でコードを記述することを目標としていました。

Object obj = ...; 
if (obj) 
    .... 

if(obj)とはどういう意味ですか? objが真かどうかをチェックしていますか?それがnullかどうかチェックしていますか?それが0かどうかチェックしていますか?コードを見ている人にとっては明らかではないし、プログラマーがこの特定の構文が何をしているかを見るためにC#のドキュメントを参照する必要があります。代わりに、代わりにC#と答えました

Object obj = ...; 
if (obj == null) 
    .... 

このようにして、何をしようとしているのかは明らかです。

これは、ローカル変数をインスタンス化してコードで使用する前に宣言する必要があるのと同じ理由です。インスタンス化されていない変数の値はあいまいであり、コンパイラの設定に依存しますので、C#では代わりに研究を行い、推測を実行するのではなく、意図を明確にするようにコードを作成する必要があります。

+0

真の演算子はC#では役に立たないのですか? – Tr1et

+0

@ Tr1et 'true'キーワードはブールリテラルで、' 5'は整数リテラル、 '' Hello World "'は文字列リテラルです。また、他のリテラルと同様に、ブール値をインスタンス化、変更、比較したいときに使用します。 – Abion47

+1

@ Abion47:彼は真のキーワードではなく、真の演算子を求めています。 – Brian

1

ボクシング。

値がボックス化されている場合、正反対のことを行うブール値を含む条件には、実際には恐ろしい混乱があります。

あなたは何をしたいですから:

object o = false; // Yes, this is legal, it makes a boxed System.Boolean 
if (o) { ... } 
ブールのようなタイプが条件でテストするために、それは大丈夫です。このため

、すべてではなく箱入り値の基本クラスですSystem.Objectため。

6

あなたの質問への基本的な答えは受け入れ答えで与えられたものです:C#は回避に設計されたので、は、より具体的にはC.

設計ミスを永続しかしません:あなたは、なぜ尋ねますタイプはoperator trueを実装していません。この質問に対する答えは、の目的operator trueは、短絡の&&||の演算子を実装することです。object&または&&または|または||のいずれかを実装することは望ましくないため、operator trueまたはoperator falseを実装する理由はありません。

関連する問題