В чем преимущество использования Path.Combine над конкатенацией строк с помощью "+"?

Я не совсем понимаю разницу.

Что может сделать Path.Combine лучше, чем отлично работает конкатенация строк?

Я предполагаю, что он делает что-то очень похожее в фоновом режиме.

Может ли кто-нибудь сказать мне, почему так часто предпочитают?

Ответ 1

Path.Combine использует Path.PathSeparator, и он проверяет, имеет ли первый путь уже разделитель в конце, чтобы он не дублировал разделители. Кроме того, он проверяет, имеют ли элементы пути для объединения недопустимые символы.

Ответ 2

Path.Combine делает больше вещей, чем просто конкатенация строк. Если вы посмотрите на исходный код,

  • Проверяет, у обоих путей есть недопустимый символ или нет
  • Проверяет второй параметр - это корневой путь или нет
  • Проверяет последний символ первого пути - директория или каталог alt или разделитель тома или нет. Если нет, объедините обе строки с разделителем каталога между ними

Ответ 3

Вот реализация

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

Вы избегаете разделителей двойных путей. Если один элемент пути уже имеет обратную косую черту. Path.Combine проверяет это и гарантирует наличие только одной обратной косой черты.

Ответ 5

В соответствии с этой 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;
    }