传递给方法时是否按顺序评估参数?

时间:2011-09-09 10:03:15

标签: c#

参数是否在传递给方法时按顺序进行评估?

对于Java来说,它总是如此,对于C来说它不是,但C#的答案是什么?

样品

string.Format("byte1={0} byte2={1} byte3={2}", 
  getNextByte(), 
  getNextByte(), 
  getNextByte());

int pos=0;
byte[] arr=new byte[] {1,2,3,4,5,6};
byte getNextByte()
{
  return arr[pos++];  
}

此示例有效,但它只是运气还是规则?

3 个答案:

答案 0 :(得分:41)

是的,作为方法的参数传递的表达式总是从左到右进行计算。

来自C#4.0语言规范:

  

7.5.1.2参数列表的运行时评估

     

在函数成员调用(第7.5.4节)的运行时处理期间,参数列表的表达式或变量引用按顺序进行评估, 从左到右 < / strong>,[...]

答案 1 :(得分:25)

正如其他人所指出的,语言规范要求以从左到右的顺序评估参数。

然而,完全披露,我们偶然而非故意在C#4.0中引入了一些错误,其中涉及命名参数,可选参数和ref遗漏参数的某些方案在调用传统COM对象时,这样在那些场景中参数的效果可能无法严格按从左到右的顺序进行评估。处理这些功能之间相互作用的分析器很复杂,并且存在一些缺陷。

我为错误道歉;我们希望在下一个版本中修复它们。

答案 2 :(得分:3)

来自语言规范:

  

在函数成员调用的运行时处理期间,参数列表的表达式或变量引用按从左到右的顺序进行计算。