Рейтинг:
2
Richard Deeming
Вместо того чтобы проверять наличие специальных символов, которые могли бы законно появиться внутри значения, проверьте количество разнесенных значений:
string[] ids = Request.QueryString.GetValues("SId");
if (ids == null)
{
// The user didn't provide any values for the "SId" parameter.
}
else if (ids.Count != 1)
{
// The user provided more than one value for the "SId" parameter.
}
else
{
SId = ids[0];
}
F-ES Sitecore
Как бы выглядел параметр запроса, если бы запятая была фактической частью данных, а не обозначала, что данные имеют несколько значений?
Richard Deeming
Что-то вроде: ?q=x,y&q=z
Request.QueryString["q"] = "x,y,z";
Request.QueryString.GetValues("q") = { "x,y", "z" };
F-ES Sitecore
По какой-то причине я думал, что браузер смешал значения вместе независимо от того, откуда я взял эту идею. +5 за то, что научил меня чему-то новому, однако если вы знаете, что запятой не будет, то проверка ее существования все равно более эффективна, даже если она "менее правильна".
Richard Deeming
Я бы не сказал, что это обязательно более эффективно. Если передано более одного значения, вы создаете новую строку со всеми значениями вместе, просто чтобы увидеть, содержит ли результат запятую:
public String this[String name]
{
get { return Get(name); }
set { Set(name, value); }
}
public virtual String Get(String name)
{
ArrayList values = (ArrayList)BaseGet(name);
return GetAsOneString(values);
}
private static String GetAsOneString(ArrayList list)
{
int n = (list != null) ? list.Count : 0;
if (n == 1)
{
return (String)list[0];
}
else if (n > 1)
{
StringBuilder s = new StringBuilder((String)list[0]);
for (int i = 1; i < n; i++)
{
s.Append(',');
s.Append((String)list[i]);
}
return s.ToString();
}
else
{
return null;
}
}
То
GetValues
метод просто копирует значения в массив:
public virtual String[] GetValues(String name)
{
ArrayList values = (ArrayList)BaseGet(name);
return GetAsStringArray(values);
}
private static String[] GetAsStringArray(ArrayList list)
{
int n = (list != null) ? list.Count : 0;
if (n == 0) return null;
String [] array = new String[n];
list.CopyTo(0, array, 0, n);
return array;
}
Источник[
^]
F-ES Sitecore
Проверка на запятую предотвращает синтаксический анализ строки и создание строкового массива, который вы никогда не будете использовать, а выделение памяти-это проклятие производительности.
Richard Deeming
Если в строке запроса передается только одно значение, то это правильно. Но тогда вам не нужно будет проверять запятую.
Если в строке запроса передается более одного значения, вы должны выделить новое StringBuilder
, добавьте к нему все строки, создайте новую строку для представления объединенного значения, а затем выполните поиск в этой строке символа.
Это, вероятно, не будет очень заметно, но это, конечно, не будет более эффективным, чем использование GetValues
.
F-ES Sitecore
Я рассчитал его время, и он вышел быстрее, чтобы проверить наличие запятой, возможно, в конечном итоге это сделал прирост эффективности StringBuilder над строковым массивом (SB будет выделять память только один раз, а не один раз на элемент массива, предполагая, что мы не имеем дело с огромными строковыми параметрами)
Richard Deeming
Это кажется странным, но я думаю, что они оптимизировали StringBuilder
для такого рода вещей. :)