ここで変数について学び始めているときに、私はこれに遭遇しました:
http://msdn.microsoft.com/en-us/library/bb384061.aspx
しかし、それがどのように合法的な表現であるかはわかりません(そうです)。(b = c)は割り当てる値を生成しないため、a =(b = c)を使用して何かに割り当てることはできないと思いましたか?
問題についての説明をありがとう。
ここで変数について学び始めているときに、私はこれに遭遇しました:
http://msdn.microsoft.com/en-us/library/bb384061.aspx
しかし、それがどのように合法的な表現であるかはわかりません(そうです)。(b = c)は割り当てる値を生成しないため、a =(b = c)を使用して何かに割り当てることはできないと思いましたか?
問題についての説明をありがとう。
それは合法です。=演算子C#リファレンスページから:
代入演算子(=)は、右側のオペランドの値を、左側のオペランドで示される格納場所、プロパティ、またはインデクサーに格納し、その結果として値を返します。
(強調鉱山)
この例のコードは不自然です(そして無意味です)が、他の場合には、より簡潔な方法で有用なことを行うために使用できます。例えば:
BinaryTree tree;
TreeNode node;
if((node = tree.FindNodeForKey(10)) != null)
{
// do useful things with returned node
}
MSDNからの引用全体は次のとおりです。
varを使用して宣言された変数は、初期化式では使用できません。言い換えると、この式は有効です。int i =(i = 20); ただし、この式はコンパイル時エラーを生成します。var i =(i = 20);
重要なのは、初期化式でvarによって宣言された変数を使用できないということです。つまり、varを使用してiを宣言する場合、=記号の反対側でiを使用することはできません。
他の人が指摘しているように、実際にはこのコードを書くことはありません。これは不自然な例です。
私はいつもそういうものを使っています。
public class Parameters
{
public readonly bool ContainsSquareBrackets;
public Parameters(string paras)
{
if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('['))
{
// do something ...
}
}
}
この特定のコードは無意味です。代入式は、割り当てられたばかりの値を返します。したがって、次の結果が得られます。
i = 20
もちろんです20
。したがって:
i = (i = 20);
と同じです:
i = 20;
場合によっては、forループのように、割り当てが何かを返すという事実が役立つことがあります。
for (string line; (line = reader.ReadLine()) != null;) { ... }
(その価値については、この特定の状況ではこのイディオムを使用しません)
または、同じ値を複数の変数に割り当てます。
int x, y;
x = y = 5;
ここで、との両方x
にy
値があります5
。
シーケンスポイントに制限を定義しないC/C ++言語とは異なり、演算子の評価の順序はデフォルトで左から右であるため、C#では合法です。。演算子は値を20に割り当て、結果として値を返します。次のように解析されます。=
int i; //<- i is declared.
i = 20; // assign 20 to i variable and returns.
i = i; // assign i as i value of.
あいまいな表現です
このコードは、リテラル値20をローカル変数iに割り当てるための非スレッドセーフな方法です。
この式i = 20
には、に20を割り当てるという副作用があり、割り当て後i
の値がありますi
。式i = (i = 20)
はiにの値を割り当てます(i = 20)
。これはほとんどの場合i
、外部割り当ての時点での値です。スレッドが中断された場合でも、式(i = 20)の値は20のままですが、外部割り当てが行われる時点でiの値が異なる場合があります。
この正確なコードを記述したいという状況はありません。
と同じ意味i = 20
ですが、特定の状況では有用な目的がある場合があります。
他の誰かがあなたのコードを維持し、次のようなものを見た場合:
if ( i = some_function() )
彼らはそれが間違いだと思って、と共感するかもしれませ=
ん==
。これがあなたが意図したことであることを示すために、あなたは使用することができます
if ( i = (i = some_function()) )
しかし、私は個人的に、if ( i = /* = */ some_function() )
または単にi = some_function(); if (i)
きれいになることを見つけます。
変数を宣言する方法についても同じアプローチを行うことができます。読んだものだけで読むのが複雑になります。
私の意見では、コードを難読化するために使用できるため、その存在はセキュリティと深い関係がありました。
次の場合でも、C ++とC#の両方で有効です。
int i = i = i = 20;
上記のステートメントは、右から左のオペランドにバルブを割り当てる代入演算子の簡単な使用法です。
代入演算子は、割り当てられた値を返します。
したがって、
i = 20
20を返します
これはiに割り当てられます。
それで、
i = (i = 20);
と同じくらい良いです
i = 20;