В чем преимущество использования Path.Combine перед объединением строк с '+'?

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

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

Я думаю, что это делает что-то очень похожее на заднем плане.

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

6 ответов

Решение

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 внутренне выполняет конкатенацию строк, используя +-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;
    }

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

System.IO.Path.Combine() Автоматически объединяет несколько путей в одну строку, используя правильный разделитель путей, т. е. косую черту '/' или обратную косую черту '', совместимый с ОС операционной системы. С другой стороны, использование конкатенации строк даст то же самое, но нам нужно будет явно (вручную) добавить правильный разделитель путей после или перед путями соответственно. например:

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

при использовании Path.Combine(),

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

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

Другие вопросы по тегам