什么时候传递给方法的参数值被复制到方法中?这种行为是否低于预期?

时间:2017-10-16 13:20:25

标签: c# .net

下面是一些非常简单的代码,它将突出我的问题/问题

static void Main(string[] args)
{
    var myInitialString = "My Initial String";
    Console.WriteLine($"{nameof(myInitialString)}: {myInitialString}");
    MyMethod(myInitialString, MyRefMethod(ref myInitialString));
    Console.ReadLine();
}

static void MyMethod(string myVariableString, string otherString)
{
    //Prints out "My Initial String"
    Console.WriteLine($"MyString in myMethod: {myVariableString}");
}

static string MyRefMethod(ref string myRefString)
{
    myRefString = "MyEdittedString";
    Console.WriteLine($"{nameof(myRefString)} = {myRefString}");
    return "OtherString";
}

如果我对此进行调试并对myInitialString进行监视,我可以在它进入"My Editted String"之前看到它的值MyMethod并保持该值。但是myVariableString参数的值为"My Initial String"。这似乎意味着在第二个参数之前捕获了变量值,这是一个已经评估过的方法。

如果我在致电MyRefMethod之前单独拨打MyMethod,它会按照我的预期运作,会打印"My Editted String"。如果我交换参数,那么对MyRefMethod的调用代表传递给MyMethod的第一个参数,它也会打印出"My Editted String"

这引出了我的问题:如何以及何时传递给方法的参数被捕获?上面显示的行为是否是预期的?

编辑:只是为了澄清,因为问题已被标记为可能重复。这不是关于引用和值类型之间的区别以及传递它们的问题。正如有人在下面指出的那样,这种行为与值类型

相同

1 个答案:

答案 0 :(得分:6)

方法的参数按从左到右,而不是从右到左的顺序进行评估。这意味着第一个参数是获取变量的值,然后计算第二个参数的表达式,更改变量的值,然后没有任何东西可以观察到这种变化。