C# var1=var2=true;优点/缺点?

C# var1=var2=true;优点/缺点?,c#,C#,在语句中使用多重赋值有什么优点或缺点?在这个简单的例子中 var1=var2=true 分配是从右到左的(我相信C#中的所有分配也是如此,可能还有Java,尽管我没有检查后者)。但是,这种编码方式是否有任何影响(编译、执行或其他) 干杯。这是可读性失败。 说出来真的不费什么 var1 = true; var2 = true; 或 没有任何编译或执行的暗示,但我个人不会这么做 使用两个单独的赋值语句更具可读性/可维护性,并且将编译为与单个语句完全相同的IL bool var1 = true; b

在语句中使用多重赋值有什么优点或缺点?在这个简单的例子中

var1=var2=true

分配是从右到左的(我相信C#中的所有分配也是如此,可能还有Java,尽管我没有检查后者)。但是,这种编码方式是否有任何影响(编译、执行或其他)


干杯。

这是可读性失败。
说出来真的不费什么

var1 = true;
var2 = true;


没有任何编译或执行的暗示,但我个人不会这么做

使用两个单独的赋值语句更具可读性/可维护性,并且将编译为与单个语句完全相同的IL

bool var1 = true;
bool var2 = true;

// versus

bool var2;
bool var1 = var2 = true;

// or

bool var1 = true, var2 = true;

它只是把东西放在一行,而不是多行。并且还清楚地表明您实际上希望var1和var2具有相同的值

var1 = true;
var2 = true;

可能看起来像c/p错误;-)

我最近使用了像code golf中那样的链式分配功能,其目标是尽可能少的字符

在此之前,我认为我从未在C#中使用过它,因为它会降低代码的可读性。要理解语句,您必须从右到左阅读,而这不是您自然阅读代码的方式

正如Anders Rune Jensen提到的,您可能想强调变量中的值应该是相同的,但您也可以在两个语句中这样做,以使其更清楚:

var1 = true;
var2 = var1;

如果实际生成的代码有任何不同,那么性能差异根本没有,或者在正常情况下太小而无法衡量。

我想我是唯一一个喜欢这种方式的人。。。也许不是两个变量,但是如果你有5个,你只是在初始化它们,为什么不呢?可以更轻松地一次全部更改它们。这些关于
var1=true的建议;var2=var1多花点心思去理解。要弄清楚
var2
实际初始化为什么,您必须查看
var1
,然后查看分配给它的是什么。我认为把它们都放在一条线上是很清楚的


如果除了初始化它们(执行一些有意义的逻辑)之外,您正在做任何事情,那么最好非常明确地说明您正在做什么(将它们放在不同的行上)。

如果您将其编写为:

bool var1 = true;
bool var2 = true;
但在我看来,更重要的是,这对于需要比较运算符而不是赋值运算符的错误来说是不明确的。最好是直言不讳。以下两个块的var1值结果相反:

bool var2;
bool var1 = var2 = false;

bool var2;
bool var1 = var2 == false;

此符号对于“代码高尔夫”非常有用:


一组有趣的回答,谢谢。我想我应该总结一下(这允许吗?)

我认为在声明简单变量的初始值时使用多重赋值也许是可以接受的,尽管这不是许多人的偏好。但大多数人认为可读性更为重要;他们的偏好是单独的陈述。我也是


我刚才在谷歌上做了进一步的搜索,发现有人在.NET1.1中进行了测试。似乎有一个非常小的打击。看一看。

我每次都会追求可读性,但最具可读性的恰恰是观点问题,取决于上下文。对于引用的两个变量,我将使用单独的行,如

var1=真
var2=真

但另一方面,对于更多的变量,我通常会使用更长的赋值来节省屏幕空间。例如,对图形进行编码,使用简单的x、y、s和t变量作为坐标是非常常见的。在这种情况下,我会毫不犹豫地选择

x=y=s=t=0

因为丢失3行屏幕空间会影响可读性。坦率地说,虽然简单是首选,但如果你不能摸索上述结构,那么你首先要做的是编码一个基于C的语法,因为另一个巨大的节省空间的结构,三元结构,将彻底击败你


a=(x==y)?价值1:价值2

类似地,考虑:

var var1, var2;
var1 = var2 = new int[3];
var1 = {1, 1, 1};
var2 = {2, 2, 2};
var1和var2现在指向同一个引用{2,2,2}


当var1和var2是引用类型(如数组)时,请记住,即使数组的元素是值类型(如int),数组仍然是引用类型。

我更喜欢传统的方法,即上面的方法。var1=var2=true对我来说没有意义。lol
bool var1=var2=true不会自行编译。您需要定义
var2
@Luke我也喜欢单独的语句。对后续开发人员调试更友好-虽然不是我的代码,但金牌Awrd获奖代码,永远不会!LOL@Kobi:说得好,我已经更新了示例。更不用说使用单行版本了;这是有代价的。除此之外,1行屏幕是宝贵的屏幕空间。@Anders:在我看来,难以阅读的代码的认知成本大于失去屏幕空间的成本。我宁愿看到
N
行可以理解的代码,也不愿看到
N+1
行让我思考太难的代码!我感觉安德斯在开玩笑;)我想说,对于
var1=var2=var3=Some.Namespace.Garbunkle.EGarbunkleMode.DefaultGarbunkleMode
,这没什么问题,但有时候也没什么问题,但根据经验-是的,为什么要麻烦呢?彼得森,在这种情况下,为什么不:
var1=Some.Namespace.Garbunkle.EGarbunkleMode.DefaultGarbunkleMode
然后
var2=var1
var3=var1
非常同意,我会分离两个变量,但为了节省屏幕空间,我会大胆地结合更多的变量。老实说,如果你不能找到像这样简单的东西,那么你首先要做的是编写一种基于C语言的代码?(我想三元运算符会完全把你拖下水:-)
// 34 symbols
bool var1 = true;
bool var2 = true;

// versus 27 symbols
bool var2;
bool var1=var2=1;

// vs 22 symbols
bool var1,var2=var1=1;
var var1, var2;
var1 = var2 = new int[3];
var1 = {1, 1, 1};
var2 = {2, 2, 2};