Java всегда передает аргументы по значению NOT по ссылке.
Позвольте мне объяснить это с помощью примера :
public class Main{
public static void main(String[] args){
Foo f = new Foo("f");
changeReference(f); // It won't change the reference!
modifyReference(f); // It will modify the object that the reference variable "f" refers to!
}
public static void changeReference(Foo a){
Foo b = new Foo("b");
a = b;
}
public static void modifyReference(Foo c){
c.setAttribute("c");
}
}
объясните это поэтапно:
f
типа Foo
и присвоение ее новому объекту типа Foo
с атрибутом "f"
. Foo f = new Foo("f");
[/g1] Foo
с именем a
и изначально назначена null
. public static void changeReference(Foo a)
[/g2] changeReference
, ссылка a
будет назначена объекту, который передается в качестве аргумента. changeReference(f);
[/g3] b
типа Foo
и присвоение ее новому объекту типа Foo
с атрибутом "b"
. Foo b = new Foo("b");
[/g4] a = b
переназначает ссылку a
NOT f
объекту, чей его атрибут "b"
. [/g5] modifyReference(Foo c)
, для объекта с атрибутом "f"
создается и назначается ссылка c
. [/g6] c.setAttribute("c");
изменит атрибут объекта, на который указывает ссылка c
, и это тот же объект, на который указывает ссылка f
. [/g7] Надеюсь, теперь вы понимаете, как объекты передачи в качестве аргументов работают в Java:)
Я понял, что вы можете сделать это с помощью Microsoft.AspNetCore.WebUtilities.QueryHelpers
в пакете Microsoft.AspNetCore.WebUtilities .
Разбирать его в словаре:
var uri = new Uri(context.RedirectUri);
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);
Обратите внимание, что в отличие от ParseQueryString
в System.Web это возвращает словарь типа IDictionary<string, string[]>
, поэтому значение представляет собой массив строк. Так как словарь обрабатывает несколько параметров строки запроса с тем же именем.
Если вы хотите добавить параметр в строку запроса, вы можете использовать другой метод в QueryHelpers
:
var parametersToAdd = new System.Collections.Generic.Dictionary<string, string> { { "resource", "foo" } };
var someUrl = "http://www.google.com";
var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl, parametersToAdd);
Самый простой и интуитивно понятный способ получить абсолютный URI и манипулировать его строкой запроса с использованием пакетов ASP.NET Core, можно сделать несколькими простыми шагами:
PM> Install-Package Microsoft.AspNetCore.WebUtilities PM> Install-Package Microsoft.AspNetCore.Http.Extensions
Чтобы указать на них, вот два важных класса, которые мы будем использовать: QueryHelpers , StringValues , QueryBuilder .
// Raw URI including query string with multiple parameters
var rawurl = "https://bencull.com/some/path?key1=val1&key2=val2&key2=valdouble&key3=";
// Parse URI, and grab everything except the query string.
var uri = new Uri(rawurl);
var baseUri = uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.UriEscaped);
// Grab just the query string part
var query = QueryHelpers.ParseQuery(uri.Query);
// Convert the StringValues into a list of KeyValue Pairs to make it easier to manipulate
var items = query.SelectMany(x => x.Value, (col, value) => new KeyValuePair<string, string>(col.Key, value)).ToList();
// At this point you can remove items if you want
items.RemoveAll(x => x.Key == "key3"); // Remove all values for key
items.RemoveAll(x => x.Key == "key2" && x.Value == "val2"); // Remove specific value for key
// Use the QueryBuilder to add in new items in a safe way (handles multiples and empty values)
var qb = new QueryBuilder(items);
qb.Add("nonce", "testingnonce");
qb.Add("payerId", "pyr_");
// Reconstruct the original URL with new query string
var fullUri = baseUri + qb.ToQueryString();
Чтобы обновляться с любыми изменениями, вы можете узнать об этом в моем блоге: http://benjii.me/2017 / 04 / синтаксический анализ изменение-запрос-строка-Asp-нетто-ядро /
Важно отметить, что за время, прошедшее с того момента, как верхний ответ был помечен как правильный, у Microsoft.AspNetCore.WebUtilities
было значительное обновление версии (от 1.xx до 2.xx).
, если вы создаете против netcoreapp1.1
, вам нужно будет запустить следующее, в котором установлена последняя поддерживаемая версия 1.1.2
:
Install-Package Microsoft.AspNetCore.WebUtilities -Version 1.1.2
Эта функция возвращает Dictionary<string, string>
и не использует Microsoft.xxx
для совместимости
Принимает кодировку параметра с обеих сторон
Принимает дубликаты клавиш (последнее значение возврата)
var rawurl = "https://emp.com/some/path?key1.name=a%20line%20with%3D&key2=val2&key2=valdouble&key3=&key%204=44#book1";
var uri = new Uri(rawurl);
Dictionary<string, string> queryString = ParseQueryString(uri.Query);
// queryString return:
// key1.name, a line with=
// key2, valdouble
// key3,
// key 4, 44
public Dictionary<string, string> ParseQueryString(string requestQueryString)
{
Dictionary<string, string> rc = new Dictionary<string, string>();
string[] ar1 = requestQueryString.Split(new char[] { '&', '?' });
foreach (string row in ar1)
{
if (string.IsNullOrEmpty(row)) continue;
int index = row.IndexOf('=');
if (index < 0) continue;
rc[Uri.UnescapeDataString(row.Substring(0, index))] = Uri.UnescapeDataString(row.Substring(index + 1)); // use Unescape only parts
}
return rc;
}
HttpRequest
имеет свойство Query
, которое предоставляет анализируемую строку запроса через интерфейс IReadableStringCollection
:
/// <summary>
/// Gets the query value collection parsed from owin.RequestQueryString.
/// </summary>
/// <returns>The query value collection parsed from owin.RequestQueryString.</returns>
public abstract IReadableStringCollection Query { get; }
Это обсуждение на GitHub указывает на это также.
Microsoft.AspNetCore.WebUtilities
. – Jaime 1 July 2016 в 09:15