c#中的初始化表达式

本文关键字:表达式 初始化 | 更新日期: 2023-09-27 18:08:35

我有以下代码行

int i = (i = 20);

,它将I的值设置为20。现在我的问题是,这两个表述相同吗?

int a = 0;
int i = (a = 20);

int a = 0;
int i = a = 20;

两个语句都将值设置为i = 20a = 20。有什么区别?

如果它们是相同的,那么为什么要用大括号来表示相等的值?

c#中的初始化表达式

From MSDN:

赋值操作符是右结合的,这意味着操作从右到左分组。例如,一个表达式形式a = b = c的求值为a = (b = c)。

是的,这两个是相同的—但是我强烈建议您不要这样初始化变量。I would much rather see:

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

两个语句是相同的吗?

是的。就像

int x = 2 + 2;

int x = (2 + 2);

是一样的。

有什么区别?

无差异。它们是一样的。

在一些罕见的情况下,应该是带括号和不带括号的表达式之间的区别,但是c#编译器实际上是宽容的,允许这样做。见return myVar和return (myVar)之间有区别吗?例如:

如果它们是相同的,那么为什么要用大括号来表示相等的值?

我不明白这个问题。你能把问题说清楚吗?

你没有问的问题:

为什么说"int i = (i = 20);"合法?

这样做很奇怪,但却是合法的。规范规定int i = x;int i; i = x;处理相同,因此这应该与int i; i = (i = 20);相同。

那为什么这是合法的呢?因为(1)赋值运算符的结果是赋值的值。(详情请参阅我关于这个主题的文章:http://blogs.msdn.com/b/ericlippert/archive/2010/02/11/chaining-simple-assignments-is-not-so-simple.aspx)和(2)因为确定赋值检查器确保在读取局部变量之前不会对其进行写入。(在这种情况下,永远不会读取;

操作顺序。当你把一些东西放在括号里时,它会先做那个操作。

并同意变量的赋值。竖着做比横着做要好。