c#中的初始化表达式

Har*_*sha 5 c#

我有以下代码行

int i = (i = 20);
Run Code Online (Sandbox Code Playgroud)

并且它将i的值设置为20.现在我的问题是,两个语句是否相同?

int a = 0;

int i = (a = 20);
Run Code Online (Sandbox Code Playgroud)

int a = 0;

int i = a = 20;
Run Code Online (Sandbox Code Playgroud)

这两个语句都将值设置为i = 20a = 20.有什么不同?

如果它们是相同的那么为什么有等价值的大括号?

sll*_*sll 10

来自MSDN:

赋值运算符是右关联的,这意味着操作从右到左分组.例如,形式a = b = c的表达式被评估为a =(b = c).

  • `a = b = c;`有两个赋值运算符.运算符是右关联的,因此最右边的运算符的副作用首先发生.`int a = b = c;`可能看起来像是一样的东西,但它不被解析为"int EXPRESSIONSTARTSHERE a = b = c EXPRESSIONENDSHERE;" - 它被解析为"int a = EXPRESSIONSTARTSHERE b = c EXPRESSIONENDSHERE"; - 只有*一个*赋值运算符.另一个`=`根本不是赋值*运算符*; 它是一个局部变量初始化器. (3认同)

Jon*_*eet 7

是的,这两个是相同的 - 但我强烈反对你不要像这样初始化变量.我会愿意看到:

int a = 0;
// Whatever the intervening code is

a = 20;
int i = a;
Run Code Online (Sandbox Code Playgroud)

  • 乔恩是对的.仅仅因为你"可以"做某事,并不意味着你应该做.代码的可读性/维护总是胜过尝试尽可能多地挤入一线式思维. (3认同)