Я не совсем понимаю разницу.
Что может сделать Path.Combine
лучше, чем отлично работает конкатенация строк?
Я предполагаю, что он делает что-то очень похожее в фоновом режиме.
Может ли кто-нибудь сказать мне, почему так часто предпочитают?
Я не совсем понимаю разницу.
Что может сделать Path.Combine
лучше, чем отлично работает конкатенация строк?
Я предполагаю, что он делает что-то очень похожее в фоновом режиме.
Может ли кто-нибудь сказать мне, почему так часто предпочитают?
Path.Combine
использует Path.PathSeparator
, и он проверяет, имеет ли первый путь уже разделитель в конце, чтобы он не дублировал разделители. Кроме того, он проверяет, имеют ли элементы пути для объединения недопустимые символы.
Path.Combine
делает больше вещей, чем просто конкатенация строк. Если вы посмотрите на исходный код,
Вот реализация
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 проверяет это и гарантирует наличие только одной обратной косой черты.
В соответствии с этой 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;
}