使用Path.Combine而不是使用’+’连接字符串有什么好处?

我看不出差别。

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

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

任何人都可以告诉我为什么它经常是首选?

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

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

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

这是实施

 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; } 

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

根据此文档, 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; }