2009-10-23 21 views
5

私はちょうど自分自身がC#の演算子と可読性

if (stringName == "firstName" || "lastName") 
    // Do code 

このエラーをするいくつかのコードに取り組んでキャッチされた、明らかに、これは間違っていると

if (stringName == "firstName" || stringName == "lastName") 
    // Do code 

する必要がありますが、それはちょうど私がに関してに考えるようになりました読みやすさが最初に簡単でしょうか?たぶん、新しいstringNameが指定されていない限り、最初のものを使用すると言うことができるいくつかのロジックがありますか?

本当に質問ではありませんが、私はこのような文を作成する背後にある論理を完全に理解していないものがあるかどうか不思議です。

+0

オペレータオーバーロードを使用できます。たとえば、文字列のリストを含むクラスを作ることができます(これはfooと呼ばれます)。演算子のオーバーロードを使用します。文字列を返すfoo(明らかに、コンテナ内の文字列を含む)とfooを作成する|| stringは文字列を追加してfooを返さなければなりません(文字列|| string || stringを使うことができます)ので、string == fooをオーバーロードして最終的に比較することができます。だから、短い答え?オペレータがロックをオーバーロード! –

答えて

10

問題を

は、私はそれを行うためのRubyの道が好きそれがブーリアンに作用するならば。

stringName == "firstName"はブール値を返します。
"lastName"は文字列リテラルです。

||は、両端でブール値をとる短絡ブール値または演算子です。

つまり、||の定義を変更したいと考えています。これは一般的には悪い考えです。

理論的には、パーサーがあなたの意味を推測することができますが、それは非常に曖昧になります。

if (stringName == firstName || lastName) 

いいですか?しかし、lastNameは正確に何ですか?

これを実行すればどうなりますか?

const bool lastName = false; 

また、&&||の反対はあるが、stringName == firstName && lastNameは、上記の論理の反対ではなく、実際には意味がありません。

if ((stringName == "firstName") || (stringName == "lastName")) 
    // Do code 

をした後、それは第二の天性になりながら:

+0

最後の行は私が逃したものです。 –

1

このような構文を許可しなかった理由は、読みやすさのためです。最初にコードを見ていて、あなたの心の状態が正確ではない場合は、stringName"firstName""lastName"の両方と比較しているとすぐにはわかりません。それはあなたの意図をはるかに明確にします。

また、かっこで解決できるかもしれません。

1

operator||(string,string)が返された場合にのみ動作します。Equalsオーバーロードがあり、文字列とその文字列のコレクションが取得され、その文字列がコレクション内にあることを確認しました。非常にめったに使われていない構造のために、舞台裏で多くの作業が行われているようです。

コードはそれが本当に、本当に悪い考えです固定するためには、明らかに間違っているとき、プログラマの意図でのコンパイラの推測を持つ
if(new string[]{"firstName","lastName"}.Contains(stringName)) 
    // code 
+1

私は実際にそれが以前よりも読みにくいと思っています。 –

+0

これは味の問題です。あなたがそれが無駄だと言ったら、私は同意するでしょう、いくつかの値を比較するだけの配列を作成します。 – Blindy

+0

他の言語でも同じテクニックが読めます: 'stringName in(" firstName "、" lastName ")...'(Python) –

6

:あなたはすでにのような何かを行うことができ、特に以来

+0

コンパイラの推測が間違っていますが、意図されました? –

+0

おそらく別の変数 'otherStringName'を使うつもりです - コンパイラはどのようにして知りますか? – tvanfosson

+0

私はあなたが言っていることを見て、それは冗長に見えます。ありがとう! –

11

私はあなたの提案が表現構文解析のルールを濁すだろうと思います。今では、 '=='はバイナリではなく、クワドレナ(?)演算子になります。私自身はしかし、SQLの 'IN' とオペレータが不足してIを見つけた、and'veこのようなものを使用:

​​
+0

またはそれを一般的にする: '(このT値、params T []値)' – Lucas

+0

@ルーカス:優れた提案! Incorporated。 –

1

私は含まれています()関数はつまり、この問題を解決見つける:

string[] ValidNames = new string[] { "firstName", "lastName"}; 

if(ValidNames.Contains(stringName)) 
{ 
    //Do Code 
} 
1

私はwouldn

if(stringName in ("firsName", "lastName")) 
{ 
} 
+1

Pythonのように見えます。 –

+0

あなたの答えは、OPの示唆された構文の欠陥ではなく、質問の意図に対応しています。 – Greg

+0

上記のPetrottaの回答を参照してください:http://stackoverflow.com/questions/1615800/c-operators-and-readability/1615835#1615835 – Lucas

2

たとえ括弧でも意味をなさない。 stringName == ("firstName" || "lastName")は、2つの文字列の真偽をテストするように見えます。これらの文字列は常に真となり、そのブール結果を文字列stringNameと比較します。あなたはこの(stringName == "firstName") || "lastName"のように括弧を追加した場合"lastName"は関係なく、"firstName"に等しいstringNameかどうかの、常に真であるので、

、条件も常に真であることを行っています。

["firstName", "lastName"].include? stringName 

あなたは常に他の人が示唆しているようContainsを使用するか、またはあなたができる場所への文字列の拡張メソッド書くことができます::

stringName.EqualsOneOf(new[] {"firstName", "lastName"}) 
0

これは習慣として、私はいつも、なぜ、あります。

0

FCLにこのスレッドで見られる多様な回答を作成する豊富な機能が含まれている場合、読みやすさは間もなくすべての豊かさの中で回答をどのように作成するのかという点でより柔軟なC#構文。メソッドとオブジェクトの呼び出しの間の選択は、時間の大部分を占めています。

ここでは、文字列の配列内で1つまたは複数の文字列を同時に検索したり、その文字列のセットに適合する他の条件を適用したりする例を示します。 インデント、スペーシング、およびコードのコメントは、このコードサンプルを理解する上で重要な役割を果たします。

 bool found = Array.Exists(
      // array of strings to search 
      new[] { "c#", ".net", "programming", "design patterns", "work", "play", "bits", "bytes", "break" }, 
      // criteria - can even satisfy multiple conditions simultaneously if desired 
      str => (str == ".NET" || str == "work") //look for ".NET" or "work" 
      );