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

Dav*_*ave 0 .net c#

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

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";
}
Run Code Online (Sandbox Code Playgroud)

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

如果我在打电话MyRefMethod之前单独拨打电话MyMethod,它就像我期望的那样工作,打印出来"My Editted String".如果我交换参数使得调用MyRefMethod代表传递给的第一个参数MyMethod,它也会打印出来"My Editted String".

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

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

Ser*_*rvy 6

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