为什么在C#中赋值操作符返回被赋的值?

7
在C#中,赋值运算符返回分配的值。这个特性在哪里/如何有用并不清楚。像这样使用它的奇怪语法可以节省一行代码,但对可读性没有好处:
   private String value;
   public void SetAndPrintValue(String value)
      PrintValue(this.value = value);
   }
   private static void PrintValue(String value) {
      /* blah */
   }

那么它的目的是什么?

1
这不仅仅是C#语法的质量问题。在某些情况下,比如if语句中,它非常方便,可以同时进行赋值和测试。然而,它确实会导致代码更加难懂,因此并不经常使用。总结:赋值是一个表达式,而不是一个语句! - Kenogu Labz
5
另一个好的方法是懒加载,例如 _myInstance ?? (_myInstance = new MyObject())。该方法会在需要时才创建对象,避免了不必要的开销。 - McGarnagle
5
btn1.Visible = btn2.Visible = false;意思是将btn1和btn2的可见性设置为false,即使它们在界面上不再显示。 - EricLaw
2个回答

12
链式赋值是许多语言的基本功能,自C语言(也可能更早)以来就一直存在。C#支持它,因为它是这些语言的一个常见特性,并且有一些有限的用途,就像goto语句一样。有时您可能会看到像这样的代码:
int a, b, c;
for(a = b = c = 100; a <= b; c--)
{
    // some weird for-loop here
}

或者这个:

var node = leaf;
while(null != node = node.parent) 
    node.DoStuff();

这可能会使一些代码更加紧凑,或者可以让你做一些聪明的技巧,但它肯定不会使它更可读。在大多数情况下,我建议避免使用它。


2
我经常使用它们的一个非常普遍的用途是在使用许多IO类进行读取操作时检查读取操作的结果,例如:while ((currentLine = streamReader.ReadLine()) != null) { ... } - Scott Chamberlain
@ScottChamberlain 是的,那也是一个很好的例子。 - p.s.w.g

4
我通常使用它来给控件分配相同的属性。
btnSubmit.Enabled = btnAdd.Enabled = btnCancel.Enabled = txtID.Enabled= false;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接