通过引用/值传递问题

时间:2013-11-14 16:27:12

标签: c# .net-3.5

我有这个传递文件数组的方法。然后,它会将/替换为\\。然后我调用一个方法并将数组传递给它,它将参数放入 new 数组,格式化它并返回新数组。接下来,我再次调用相同的方法,传递相同的本地数组,格式化不同,并out两个数组。问题是,第二个方法调用是保留第一个方法调用的格式。

    public void Verify(string[] svnFiles, out string[] local, out string[] build)
    {            
        //replace / with double \\
        var transformed = TransformToFolders(svnFiles);

        build = GetFiles(_buildPath, transformed);
        local = GetFiles(_localPath, transformed);
    }

    private static string[] GetFiles(string path, params string[] files)
    {
        var moddedFiles = files;
        for (var i = 0; i < files.Count(); i++)
            moddedFiles[i] = string.Format(@"{0}\{1}", path, moddedFiles[i]);

        return moddedFiles;
    }

因此,当我致电local = GetFiles(_localPath, transformed); transformed时,其值与moddedFiles相同。 GetFiles用于直接操作其files参数,我得到了同样的行为,这就是为什么我尝试创建一个新数组,但moddedFiles似乎仍然只是一个参考而不是实际副本。是否有一种简单的方法来制作它的实际副本,以便我基本上没有得到_localPath\_buildPath\moddedFile

1 个答案:

答案 0 :(得分:4)

这听起来像你想要的:

var moddedFiles = (string[]) files.Clone();

这将创建一个数组的浅表副本,这在字符串方面大致相当于深层副本,因为它们是不可变的。

然而,更清洁(IMO)的替代方案是使用LINQ:

private static string[] GetFiles(string path, params string[] files)
{
    return files.Select(file => string.Format(@"{0}\{1}", path, file))
                .ToArray();
}

或者如果你真的想保留原始的粗略方法,你不需要真正克隆数组 - 只需创建一个大小合适的新数组。

private static string[] GetFiles(string path, params string[] files)
{
    var moddedFiles = new string[files.Length];
    for (var i = 0; i < files.Length; i++)
    {
        moddedFiles[i] = string.Format(@"{0}\{1}", path, files[i]);
    }
    return moddedFiles;
}