out
параметры в SQL Server забавны. Вы должны повторить себя везде .
В частности, здесь вы забыли упомянуть об этом в списке параметров при вызове хранимого процесса. dbo.InsertPhones @model, @out
должно быть dbo.InsertPhones @model, @out out
. Также может быть способ пропустить список параметров из этой строки и указать SQL Server, что вы даете ему имя хранимой процедуры, а не произвольный текст запроса, но я не уверен, как вы будете делать это конкретно здесь (с SqlCommand
объект, это будет через свойство CommandType
).
Если вы используете параметр out
, select
в конце хранимой процедуры не требуется, но я предполагаю, что это была попытка исправить.
IMO, это намного лучше ясно определить такую логику т.е. не использует конкатенацию строк, чтобы избежать пустой строки и использовать условный оператор или?? оператор.
Относительно других комментариев:
существует также выигрыш в производительности к использованию объединяющего пустой указатель оператора, так как никакая конкатенация не должна произойти (и, поэтому, никакой дополнительный строковый экземпляр не создается излишне),
Не верно. Компилятор C# компилирует "" + string2 в 100% тот же код как string1?? "". Кроме того, компилятор C# переводит + оператор для вызова в строку. Метод Concat, который в свою очередь проверяет споры со строкой. IsNullOrEmpty функционируют, и не выделяет новую строку в этом случае.
Также я рекомендовал бы использование Строки. Пустой по, "" поскольку это - константа и не требует создания новой Строки
Строка поддержки платформы.NET, интернирующая так "" и строка. Пустая точка к тому же региону памяти
Я не думаю, что каждый больше читаем, чем другой лично. Я предпочитаю это:
string foo = str ?? "";
просто, потому что я действительно как?? оператор.
Если бы Вы - новичок бренда, я думаю, что это было бы немного легче понять:
string foo = str == null ? "" : str;
или
string foo = "";
if (str != null) foo = str;
Однако Вы вид потребности спросить себя, "Как простой Вы действительно хотите добраться?"
Я предпочел бы Ваш второй пример первому, поскольку это является более превентивным против str
быть пустым и более выразительно. Также я рекомендовал бы использование String.Empty
""
поскольку это - константа и не требует создания нового String
(и да это - экстремальное значение, придираются к мелочам, но важный для примечания).
Вторая строка выглядит более читаемой мне, она ясно дает понять намерение выражения правой стороны.
В то время как я предпочитаю вторую строку с технической точки зрения, первая строка на самом деле более читаема мне...
Я использовал бы объединить оператор или foo = str == null ? "" : str;
по двум причинам:
Первый пример не имеет того же поведения на других языках курчавой фигурной скобки (особенно Java и JavaScript), где добавление нулевой ссылки к пустой строке приводит к строке, содержащей текст null
. В результате первый пример требует намного большего умственного усилия гарантировать, что это приведет к корректному поведению на создаваемом языке. Даже, учитывая другие подсказки это - C# (такой как строчный тип string
), что-либо, что требует, чтобы разработчик замедлился и думал, "что является намерением этого кода" результаты в потерянной производительности. Это могло также представить ошибки при перемещении от языка до языка.
Второй пример более ясно выражает намерение кода, который, как описано в исходном вопросе является:
when str is null set foo to an empty string
В противоположность первому примеру, который может быть считан как:
set foo to an empty string with str appended (which may have the side effect of setting foo to an empty string when str is null)
Как программисты, мы должны, вероятно, пытаться выразить намерение нашего кода, вместо того, чтобы полагаться на побочные эффекты других операций дать нам результаты, которые мы хотим.