0

私はdocumentationを見て、(1)(2)に答えて、| =演算子がどのようなもので、どのように動作するのかを説明しようとしていますが、基本的なレベルでは意味があります。またはそれが何を達成するか代入演算子(| =)はどのように機能しますか? (C#)

説明はa |= ba = a | bと同等であると言うが、それは自分自身(a)またはbの値の値aを与えるかどうかをどのように評価するか、私は得ることはありません。私の理解から、「または」はの2つのうちの1つになることができることを意味しますが、2つのもののどちらを指定していません。

Visual Studioでは、Refactoring Essentialsと呼ばれる拡張機能を使用しています。これは、コードの一部を| =演算子で置き換えることを提案しています。コードはそこの演算子で動作しますが、それがどのように成し遂げられたのか、それは私にオンラインでそれを研究しようとするプロンプトでした(そしてその結果、この質問をしてください)。

私のコードは

if (MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No) 
{ 
    e.Cancel = true; 
} 

から

e.Cancel |= MessageBox.Show("Are you sure you want to cancel this operation?", "Confirm Cancel", MessageBoxButton.YesNo, MessageBoxImage.Exclamation, MessageBoxResult.No) == MessageBoxResult.No; 

に行って、それはまだ働いていました。私はe.CancelMessageBox.Show(...) == MessageBoxResult.Noの評価に基づいて決定されていると推測していますが、そこではなぜ= =演算子が必要なのかわかりません。式の結果がブール値で、e.Cancelがブール値をとるので、単に標準代入(=)演算子を使用しないのはなぜですか?条件付き(?:)演算子の使用はどうですか? |それとどう比較すれば(たとえそれがあっても)?

+1

これは別の方法です。その事が既にキャンセルされている場合(CancelはMessageBoxを表示する前にtrueの値をとります)、MessageBoxの回答は重要ではありません。しかし、私はそのようなリファクタリング結果のファンではないので、それは本当に読みにくく理解している。 :Pそれは不必要な過度のように見える。 – mikes

+0

@mikes私が受け入れた答えは、オペレータがすべてについて理解してくれました。私はリファクタリングのことについて同意します。どのように私はこの1つにもしばらくの間困惑していたことを考えると、これはリファクタリングの可能性があります。コードの可読性を損なうので、私がコードに実装することはないという拡張が私に与えるいくつかの他のリファクタリングの選択肢があります。 – JaykeBird

答えて

6

|はBITWISE OR演算子ですが、BOOLEAN OR演算子ではありません。

はあなたがそれらをビット単位のOR場合は、ビットは、第1または第2の中に設定されている各位置のための出力の1ビットセットを取得する2つの8ビットの2進数10110100と11000101.

を持っていると仮定します入力、2つの入力ビットのどちらも設定されている0ビット:これだけです

10110100 
11000101 
-------- 
11110101 

すでにご存知のように、x |= y;はまったく同じx = x | y;と同じです。注意すべき

最終ポイントは、boolに適用|&ビット演算の目的のために1 = trueおよび0 =偽、1ビット数であるかのようboolが扱われることです。

ただし、boolintビット単位の操作を混在させることはできません。たとえば、次のようにコンパイルエラーを与える:

bool t = true; 
bool f = false; 
int x = t | f; // Error: Cannot implicitly convert type 'bool' to 'int' 

補遺:人々はboolではなく、ために&=|=を使用することを

理由より論理的と思われるものを(しゃれ意図)&&=||=です後者の2つの演算子は実際には存在しません!

+3

私のコードの文脈では、 'MessageBox.Show(...)== ...'が真で 'e.Cancel'が偽ならば、結果はまだ真です。値が変更された場合も同じです( 'e.Cancel'がtrueで、' MessageBox ... 'がfalseの場合)。 'e.Cancel'と' MessageBox ... 'のどちらも真でなければ、falseに設定されます。さて、私はこのナッジを持っていたので、私は今それを取得し始めていると信じています。申し訳ありませんが、私の質問がちょっとばかげているように見える場合、私はこの結論を決してしたことはありません。私は正直なところ、「ビット単位OR」演算子が事実であることを忘れていました。お手伝いありがとう! – JaykeBird

+0

@JaykeBirdそうです、あなたは今それを持っています。 –

関連する問題