我在这里开始学习变种时偶然发现了这一点:
http://msdn.microsoft.com/en-us/library/bb384061.aspx
但是,我不知道这是一个法律表达(它是)。我以为你不能使用a =(b = c)来分配东西,因为(b = c)不会产生要分配的值?
感谢您对此事的任何澄清。
答案 0 :(得分:31)
这是合法的。来自= operator C# reference page:
赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置,属性或索引器中,将该值作为其结果返回。 < / p>
(强调我的)
示例中的代码是设计的(并且毫无意义),但它可以在其他情况下用于以更简洁的方式执行有用的操作。例如:
BinaryTree tree;
TreeNode node;
if((node = tree.FindNodeForKey(10)) != null)
{
// do useful things with returned node
}
答案 1 :(得分:14)
MSDN的全部引用是:
使用var声明的变量不能在初始化表达式中使用。换句话说,这个表达式是合法的:int i =(i = 20);但是这个表达式会产生一个编译时错误:var i =(i = 20);
关键是你不能在初始化表达式中使用var声明的变量。换句话说,如果你使用var来声明i,那么你就不能在=符号的另一边使用i。
正如其他人所说,你实际上不会写这段代码。这是一个人为的例子。
答案 2 :(得分:6)
我一直都在使用那种东西。
public class Parameters
{
public readonly bool ContainsSquareBrackets;
public Parameters(string paras)
{
if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('['))
{
// do something ...
}
}
}
答案 3 :(得分:4)
这个特殊代码毫无意义。赋值表达式返回刚刚分配的值。因此,结果:
i = 20
当然是20
。因此:
i = (i = 20);
与:
相同i = 20;
有时,赋值返回某些内容的事实可能很有用,例如for for循环:
for (string line; (line = reader.ReadLine()) != null;) { ... }
(对于它的价值,我不会在这种特殊情况下使用这个成语)
或者为多个变量分配相同的值:
int x, y;
x = y = 5;
现在,x
和y
的值均为5
。
答案 4 :(得分:3)
它在C#中是合法的,因为默认情况下为the order of evaluation for operators is left to right,与C / C ++语言不同,{+ 3}}中没有定义限制。 =
运算符将值赋值为20并返回值作为结果。它被解析为:
int i; //<- i is declared.
i = 20; // assign 20 to i variable and returns.
i = i; // assign i as i value of.
答案 5 :(得分:2)
代码是非线程安全的方式,将文字值20分配给局部变量i。
表达式i = 20
具有向i
分配20的副作用,并且在赋值后具有值i
。表达式i = (i = 20)
为(i = 20)
分配值,该值几乎总是i
在外部赋值时的值。如果线程被中断,表达式(i = 20)仍将具有值20,尽管在外部赋值发生时我可能有不同的值。
在任何情况下,您都不希望编写这些确切的代码。
答案 6 :(得分:1)
虽然它与i = 20
的含义相同,但在某些情况下可能会有用。
如果其他人会维护您的代码,并看到类似的内容:
if ( i = some_function() )
他们可能认为这是一个错误,并且=
与==
重新对齐。
要表明这是您打算做的,您可以使用
if ( i = (i = some_function()) )
但是,我个人认为if ( i = /* = */ some_function() )
或i = some_function(); if (i)
更清洁。
答案 7 :(得分:0)
即使以下内容在C ++和C#中都有效:
int i = i = i = 20;
上面的陈述是一个简单的使用赋值操作符从右到左操作数分配阀门。
答案 8 :(得分:0)
你可以采用相同的方法,如何声明一个变量..它只是你读过的那个让它变得复杂。
它存在是因为它可以用来混淆代码,在我看来它的存在与安全性有很深的联系。
答案 9 :(得分:0)
赋值运算符返回赋值。
因此,
i = 20
返回20
分配给i。
所以,
i = (i = 20);
和
一样好i = 20;