a = b = c编码标准

Mat*_*yle 3 c# coding-style

我负责在组织内创建编码标准和进行代码审查.

我在源代码中遇到了这样的东西:

object.Property = myVar1 = myVar2;
Run Code Online (Sandbox Code Playgroud)

我个人并不是这样做的,因为我发现它令人困惑.我看到这个,我想这样读:

object.Property = myVar1 == myVar2;
Run Code Online (Sandbox Code Playgroud)

现在我知道它在做什么:它将myVar分配给myVar2,然后将object.Property分配给myVar2.编码标准文档没有明确说明您是否可以这样做.但它确实声明不在if语句中分配变量.

我想我的问题是,作为一种编码实践而不是这样做的风格是不是很糟糕?我不喜欢制定代码标准政策"仅仅因为我这么说"

编辑以更好地解释我的理解

SLa*_*aks 8

我总是在括号中包含等式表达式:

object.Property = (myVar1 == myVar2);
Run Code Online (Sandbox Code Playgroud)

这引起了人们的注意,这不是一项任务.


Ray*_*oal 7

这种所谓的"链式任务"确实存在争议,并且有很多关于SO的问题可以解决它.

正如你所知,它是作为表达而不是陈述的赋值的副产品,对许多人来说,它可能令人困惑.

它对很多语言来说对新手来说有些危险.在语言中,它[]是空数组对象的构造函数,写作

a = b = []
Run Code Online (Sandbox Code Playgroud)

制作ab引用同一个对象.新手倾向于认为它创建了两个独立的空数组,可以独立填充.不是这样!C#等价物,

a = b = new SomethingOrOther();
Run Code Online (Sandbox Code Playgroud)

可以说是不太可能发生,因为a并且b更有可能在声明时初始化,并且这种双重赋值会更少,而且C#程序员更有可能在这种情况下看到明显的共享.

制定禁止此行为的一个很好的理由是三方面的:

  1. 这是完全没必要的.
  2. 它容易出错(如上面的数组示例中所示).

当您遇到容易出错的构造时,您应该避免使用它们,因为在避免它们时,您将永远不会发生该特定错误.当然,在C#中,它可能比其他语言更不容易出错.