我今天正在编写一些代码,并且当我在另一台显示器上的屏幕上进行alt-tabbed以检查某些内容时处于中间位置。当我回头看时,ReSharper将灰色下面的第3行着色,并注明“分配的值未在任何执行路径中使用”。
var ltlName = (Literal) e.Item.FindControl("ltlName");
string name = item.FirstName;
name +=
ltlName.Text = name;
我很困惑;肯定这段代码无法编译。但确实如此,它也运行了。 “name + =”行对字符串没有影响(我可以告诉)。这是怎么回事?
(Visual Studio 2008,.NET 3.5)
答案 0 :(得分:24)
请注意,换行符在C#中并不特殊。由于以下行,编译器的完整语句是
name += ltlName.Text = name;
这是一个有效的声明(它将name
分配给ltlName.Text
,然后将其附加到name
。)
答案 1 :(得分:19)
这样做:
name += ltlName.Text = name;
或使其更清晰:
name += (ltlName.Text = name);
属性设置器的结果是设置的值,所以它有点像这样:
string tmp = name;
ltlName.Text = tmp;
name += tmp;
当你涉及到不同的变量时,观察这个更简单,只是作为最后一步而不是复合赋值的简单赋值。这是一个完整的例子:
using System;
class Test
{
public string Text { get; set; }
static void Main()
{
Test t = new Test();
string x = t.Text = "Hello";
Console.WriteLine(x); // Prints Hello
}
}
简单分配规则(第7.17.1节)用于确定表达式的结果:
简单分配的结果 expression是赋给的值 左操作数。结果有了 与左操作数相同的类型是 总是被归类为价值。
因此ltlName.Text = name
的类型与ltlName.Text
的类型相同,并且值是已分配的值。它是属性而不是字段或局部变量的事实不会改变这一点。
答案 2 :(得分:5)
在C#中,换行不终止语句 - 只有分号。因此,以下代码行正在执行:
name += ltlName.Text = name;
答案 3 :(得分:1)
因为空格在C#中无关紧要,所以第3,4和5行形成一个语句:
name += ltlName.Text = name;
答案 4 :(得分:1)
正如预期的那样,结果是名称连接到自身。所以你得到“namename”。
obj.Text只是一个属性,因此该行最终转换为
//name += obj.Text = name;
obj.setText(name);
name += obj.Text;
以下的完整资源
public class Program
{
public static void Main(string[] args)
{
MyClass obj = new MyClass();
string name = "name";
name += obj.Text = name;
Console.Write(name); //prints namename
}
}
答案 5 :(得分:0)
它影响字符串,但直到字符串用于影响显示器上的文字后才会出现。正如KennyTM指出的那样,这两行都形成了一个声明。与VB不同,回车不会在C#中结束语句。分号的确如此。那么这里发生的是字符串被设置为文字,并且该操作的结果(可能是“true”或者只是字符串本身?我不记得了)被附加到字符串。