下面是一些非常简单的代码,它将突出我的问题/问题
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"
。
这引出了我的问题:如何以及何时传递给方法的参数被捕获?上面显示的行为是否是预期的?
编辑:只是为了澄清,因为问题已被标记为可能重复。这不是关于引用和值类型之间的区别以及传递它们的问题。正如有人在下面指出的那样,这种行为与值类型
相同答案 0 :(得分:6)
方法的参数按从左到右,而不是从右到左的顺序进行评估。这意味着第一个参数是获取变量的值,然后计算第二个参数的表达式,更改变量的值,然后没有任何东西可以观察到这种变化。