c#是否有任何不遵循从左到右评估顺序的陈述?

时间:2009-07-03 17:05:12

标签: c# language-design

关于语言设计的空闲问题,请参阅"Does C# have a right hand if like Perl"

例如,在最近的C系列语言中

z = foo ( a, b, c );
评估

a,然后b,然后c,从左到右。

z = a ? b : c;

a会被评估,然后是bc,从而从左到右依次进行评估。

在Python中,您将条件表达式编写为

z = b if a else c

所以订单是相同的 - a,然后是bc,但它不是从左到右。

严格的从左到右的顺序被放入Java中以简化语言;排序是依赖于C或C ++的实现。

6 个答案:

答案 0 :(得分:3)

从右到左分配(有点):

int a = b + c;

b + c得到评估,然后分配给。


总的来说,C#设计师一直试图保留大部分内容 - >正确。一个很好的例子是LINQ。在这里,他们没有使用传统的SQL排序(SELECT XXX FROM XXX),而是故意将查询重新排序为更左 - >右。

// Note the left->right ordering:
var results = from member in collection where member.element == condition select member;

// Which is equivelent to:
var resultsNonLinq = collection.Where().Select();

这是我喜欢C#的原因之一 - 语言的一致性非常令人耳目一新,特别是与perl这样的语言相比时,有很多方法可以做简单的事情。

答案 1 :(得分:3)

不,它不会检查MS C#lang规范或ECMA334规范(第14章)

答案 2 :(得分:0)

不,但你显然在找东西。

Try this

答案 3 :(得分:0)

C#有三元运算符:

result = a == b ? c : d

相当于

if (a == b)
    result = c;
else
    result = d;

这不是严格的向右,但它确实减少了所需代码的数量。

答案 4 :(得分:0)

你忘记在你的问题中提出任何实际问题......我认为你的意思是标题是问题......;)

您可以使用扩展程序和委托来制作看似从右到左评估的内容。实际上它仍然是从左到右进行评估,但是左边的代码放在一个委托中,只根据右边条件的结果使用。

您可以使用名称If。

对Action委托进行扩展
public static class PostCondition {
   public static void If(this Action action, bool condition) {
      if (condition) action();
   }
}

现在您可以创建一个委托,将其强制转换为Action,并在其上调用If方法:

((Action)(() => Console.WriteLine("Yes"))).If(true);

如果将它分成两个语句,它会变得更清晰:

Action writeYes = () => Console.WriteLine("Yes");
writeYes.If(true);

不过,无论如何,它并不比普通的if语句真正改善......

答案 5 :(得分:0)

我假设你实际上指的是右关联运算符,它们是运算符右侧的运算符。

C#中的大多数运算符都是左关联的,除了:

  • 作业运算符(x =表达式)
  • 所有一元运算符(“ - ”,“!”,“〜”),包括类型转换(但这不是真正的运算符)

从技术上讲,还有另外一个:三元运算符(a?b:c),但这是一个如此不同的野兽,它几乎不能作为右关联运算符。