var baseUri = new Uri("http://my.server.com/folder/directory/sample");
var absoluteUri = new Uri(baseUri,"../../other/path");
ИЛИ
Uri uri;
if ( Uri.TryCreate("http://base/","../relative", out uri) ) doSomething(uri);
Проблема в Точки последовательности . В этом статусе есть две операции без точки последовательности, поэтому нет определенного порядка для оператора, выполняется ли сначала присваивание или приращение?
Ничто не говорит о том, что это небезопасно, это просто не определено,
Использование x
и x ++
(или ++ x
) в одном операторе приводит к неопределенному поведению в C. Компилятор может делать все, что хочет: либо увеличивать x
до выполнения присваивания, либо после этого. Взяв код Олафура, он может дать f == 5
или f == 6
, в зависимости от вашего компилятора.
Статья по ссылке (очищено) , которую вы предоставили, дает ответ. «C почти не обещает, что побочные эффекты будут возникать в предсказуемом порядке в пределах одного выражения». Это означает, что вы не знаете, в каком порядке будут появляться символы = и ++. Это зависит от компилятора.
Если вы перейдете по ссылке из этой статьи на статью о точках последовательности на том же сайте, вы увидите, что компилятор может оптимизировать то, что и когда он записывает значения обратно из записывается в переменные.
6.5 (2) Если побочный эффект на скалярный объект не упорядочен относительно другого побочного эффекта на том же скалярном объекте или вычисления значения с использованием значение того же скаляра объект, поведение не определено. Если существует несколько допустимых порядков подвыражения выражения, поведение не определено, если такая неупорядоченная сторона эффект возникает в любом из порядков. 74)
74) Этот абзац отображает неопределенные выражения операторов, такие как
i = ++i + 1; a[i++] = i;
, при этом разрешая
i = i + 1; a[i] = i;
Я поддерживаю ответ Артура в этом отношении. Хотя реализация оператора пост-инкремента, т.е. f ++, сбивает с толку, она не считается небезопасной. Вы должны сначала понять, как компилятор интерпретирует это. будет ли он увеличивать f после того, как встретит завершение предложения (;), или сразу после использования значения f.