C# 使用 params 关键字的结果不一致

标签 c# pass-by-reference parameters pass-by-value

给定以下方法:

static void ChangeArray(params string[] array) {

    for (int i = 0; i < array.Length; i++) 
        array[i] = array[i] + "s";
}

如果我调用它来传递一个字符串数组,这将起作用:

string[] array = {"Michael", "Jordan"} // will become {"Michaels", "Jordans"}
ChangeArray(array);

但如果我使用字符串参数调用它,将无法工作:

string Michael = "Michael";
string Jordan = "Jordan";
ChangeArray(Michael, Jordan); // This will NOT change the values of the variables

我知道编译器会将 Michael 和 Jordan 包装在一个数组中,所以这两种情况的结果不应该相同吗?

最佳答案

你的第二个例子本质上是:

string Michael = "Michael";
string Jordan = "Jordan";
{
    var tmp = new string[] {Michael, Jordan};
    ChangeArray(tmp);
}

所以;实际上,tmp 改变了……但是 tmp 之后被丢弃了,所以你什么也看不到。 params 模拟 ref - 它不会对原始变量进行位置更新。或者在代码中,它不是如下:

string Michael = "Michael";
string Jordan = "Jordan";
{
    var tmp = new string[] {Michael, Jordan};
    ChangeArray(tmp);
    Michael = tmp[0];
    Jordan = tmp[1];
}

如果您需要它表现得像那样,那么编码它就像那样 - 或者改用带有 ref 参数的重载。

关于C# 使用 params 关键字的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12526049/

相关文章:

F#:如何编写经典的交换函数?

c++如何让函数参数采用不同的对象(但属于同一类)并访问通过w/n函数调用传递的w/e对象的函数?

perl - 当参数的值是 0 时,为什么我的 Perl 程序会打印帮助消息?

c# - 使用另一个方法作为参数

Python下划线作为函数参数

c# - 在 C# 中生成图像上的纹理

c# - 捕获异常后继续程序?

c++ - 在 C++ 中,通过指针或实例访问类/结构的优点是什么

c# - 尝试在 VS 2017 中的 ASP.NET Core 中构建项目时出现 UseBrowserLink 错误

c# - 使用 SasLocator 上传到 Azure 媒体服务/blob 存储不显示上传的文件