Как повторно использовать объект `Uri` в .NET?

#c# #.net

Вопрос:

В целях оптимизации я хочу повторно Uri использовать объект вместо многократной инициализации нового.

Я не хочу этого:

 Uri uri = new Uri("test");
uri = new Uri("test2");
uri = new Uri("test3");
 

но я хочу что-то вроде этого:

 Uri uri = new Uri("test");
uri.AbsoluteUri = "test2";
uri.AbsoluteUri = "test3";
 

Можно ли повторно Uri использовать объект вместо создания нового?

Комментарии:

1. Мне это кажется преждевременной оптимизацией; вы выявили проблему с производительностью?

2. Мне неясно, какой экономии, по вашему мнению, вы могли бы достичь, избегая конструктора и вместо этого назначая строку, учитывая, что в любом случае, вероятно, будут понесены одни и те же накладные расходы на синтаксический анализ.

3. Uri содержит довольно много других свойств, кроме AbsoluteUri того . Только изменение этого свойства может вызвать проблемы в долгосрочной перспективе, т. е. у вас будут противоречивые данные. Кроме того, я сомневаюсь, что создание нескольких экземпляров вызовет какие-либо проблемы с производительностью. Кроме того, конструктор выполняет некоторую дополнительную обработку, которую вы пропускаете.

4. Если вы хотите упростить создание большого количества различных Uri объектов для похожих URI без повторения кода, вы могли бы рассмотреть возможность использования UriBuilder класса для этого.

Ответ №1:

Тебе нужна UriBuilder . Uri класс является неизменяемым, и все свойства доступны только для чтения. UriBuilder предоставляет альтернативу, которая позволяет изменять свойства базового Uri экземпляра, предоставляя изменяемые свойства. Однако вам нужно быть осторожным при изменении значений, так как вам нужно убедиться, что каждое свойство соответствует вашему новому uri. Взгляните: https://docs.microsoft.com/en-us/dotnet/api/system.uribuilder?view=net-5.0

 var uriBuilder = new UriBuilder("http://www.example.com")
Console.WriteLine(uriBuilder.Uri)   //prints http://www.example.com
uriBuilder.Host = "www.google.com"
Console.WriteLine(uriBuilder.Uri)   //prints http://www.google.com
 

Вы всегда должны быть уверены, что всякий раз, когда вы меняете какое-либо свойство, другие свойства также остаются в соответствии с тем, чего вы хотите достичь, например UserName , Password свойства и также могут потребоваться изменить при Host изменении a.

Ответ №2:

Согласно Википедии https://en.wikipedia.org/wiki/Uniform_Resource_Identifier

Универсальный идентификатор ресурса (URI) — это уникальная последовательность символов, которая идентифицирует логический или физический ресурс, используемый веб-технологиями. URI могут использоваться для идентификации чего угодно, включая объекты реального мира, такие как люди и места, концепции или информационные ресурсы, такие как веб-страницы и книги.

Так как URI уникален, то изменить строку URI не должно быть возможно, но вместо этого у вас должен быть другой URI для каждой уникальной строки. И, следовательно, вам нужно создать новый объект для каждого из них, и вы не можете его изменить.

Ответ №3:

Насколько я понимаю, Uri неизменяем, поэтому свойства класса доступны только для чтения.

Похоже, вы можете использовать UriBuilder, если вам нужно изменить элементы Uri после создания.

https://docs.microsoft.com/en-us/dotnet/api/system.uribuilder?redirectedfrom=MSDNamp;view=net-5.0