使用 Path.Combine 比使用“+”连接字符串有什么优势?

问题描述 投票:0回答:6

我不太明白其中的区别。

还有什么比

Path.Combine
能比完美的字符串连接做得更好呢?

我猜它在后台做了一些非常相似的事情。

谁能告诉我为什么它如此受欢迎?

c# concatenation
6个回答
45
投票

Path.Combine
使用
Path.PathSeparator
并检查第一个路径末尾是否已有分隔符,因此不会重复分隔符。此外,它还会检查要组合的路径元素是否包含无效字符。


20
投票

Path.Combine
不仅仅可以做字符串连接。如果你看一下源代码

  • 检查两个路径是否包含无效字符
  • 检查第二个参数是否是根路径
  • 检查第一个路径的最后一个字符是否是director或alt目录或卷分隔符。如果不是,则将两个字符串与目录分隔符连接起来

5
投票

这是实现

public static string Combine(string path1, string path2)
{
    if (path1 == null || path2 == null)
    {
        throw new ArgumentNullException((path1 == null) ? "path1" : "path2");
    }
    Path.CheckInvalidPathChars(path1, false);
    Path.CheckInvalidPathChars(path2, false);
    return Path.CombineNoChecks(path1, path2);
}

private static string CombineNoChecks(string path1, string path2)
{
    if (path2.Length == 0)
    {
        return path1;
    }
    if (path1.Length == 0)
    {
        return path2;
    }
    if (Path.IsPathRooted(path2))
    {
        return path2;
    }
    char c = path1[path1.Length - 1];
    if (c != Path.DirectorySeparatorChar && c != Path.AltDirectorySeparatorChar && c != Path.VolumeSeparatorChar)
    {
        return path1 + Path.DirectorySeparatorChar + path2;
    }
    return path1 + path2;
}

4
投票

根据此 documentation

Path.Combine
在内部使用
+-Operator
执行字符串连接。

private static String CombineNoChecks(String path1, String path2)
{
    if (path2.Length == 0)
        return path1;
 
    if (path1.Length == 0)
        return path2;
                
    if (IsPathRooted(path2))
        return path2;
 
    char ch = path1[path1.Length - 1];
    if (ch != DirectorySeparatorChar && ch != AltDirectorySeparatorChar && ch != VolumeSeparatorChar) 
        return path1 + DirectorySeparatorCharAsString + path2;
    return path1 + path2;
}

2
投票

您可以避免使用双路径分隔符。如果一个路径元素已经有一个前导反斜杠。 Path.Combine 检查这一点并确保只存在一个反斜杠。


1
投票

System.IO.Path.Combine() 通过使用正确的路径分隔符(即与操作系统操作系统兼容的正斜杠“/”或反斜杠“”,自动将多个路径组合为单个字符串。 另一方面,使用字符串连接会执行相同的操作,但我们需要显式(手动)在路径之后或之前分别向路径添加正确的路径分隔符。 例如:

   string virtualPath = "/data/directory" +"/" + "video.mp4";

使用 Path.Combine() 时,

string virtualPath = Path.Combine("/data/directory", "video.mp4");

Path.Combine() 和字符串连接方法都会产生相同的结果,但 Path.Combine() 方法提供了一种更优雅的方法来组合路径。

© www.soinside.com 2019 - 2024. All rights reserved.