Я новичок в С# и пытаюсь изучить лучшие практики. На прошлой неделе я столкнулся со многими ситуациями, в которых мне нужно сделать выбор между более длинным + более простым кодом или более коротким кодом, который объединяет несколько действий в один оператор. Каковы некоторые стандарты, которые вы используете в качестве ветеранов, когда пытаетесь написать четкий, сжатый код? Вот пример кода, который я пишу двумя вариантами. Что предпочтительнее?
A)
if (ncPointType.StartsWith("A"))//analog points
{
string[] precisionString = Regex.Split(unitsParam.Last(), ", ");
precision = int.Parse(precisionString[1]);
}
else
precision = null;
B)
if (ncPointType.StartsWith("A"))//analog points
precision = int.Parse(Regex.Split(unitsParam.Last(), ", ")[1]);
else
precision = null;
Нет никакого правильного или неправильного. Это мнение основано на самом деле.
Однако помните, что добавление фигурных скобок, добавление комментариев, добавление пробелов или что-то еще, это не влияет на производительность или размер последней сборки, потому что компилятор очень хорошо ее оптимизирует. Итак, почему бы не пойти с более подробным, чтобы другие программисты могли следовать ему проще?
Как отмечают все остальные, нет никаких жестких "правил" как таковых, но, вероятно, должны быть скобки вокруг обоих блоков кода; оба A и B имеют характеристики, сходные с ошибкой Apple goto, поскольку вводят потенциальную двусмысленность.
Рассматривать:
void Main()
{
int x=1;
if (x==1)
Console.WriteLine("1");
else if (x==2)
Console.WriteLine("NOT 1");
Console.WriteLine("OK");
}
будет производить
1
OK
Для кого-то, просматривающего код, особенно если он окружен другим, безобидным выглядящим кодом, это может быть легко ошибочно воспринято как "только распечатать" ОК ", если x==2
). Очевидно, некоторые люди это заметят, а некоторые не будут, но почему представить опасность для отсутствия скобы фигурных скобок :)
В конечном счете это сводится к вашему выбору, потому что это не имеет ничего общего с производительностью, но я также хотел бы отметить, что вы не можете создавать или определять переменные, если опустить фигурные скобки:
int a = 0;
if (a == 0)
int b = 3;
Недействительно, тогда как:
int a = 0;
if (a == 0)
{
int b = 3;
}
Действует.
error CS1023: An embedded statement may not be a declaration or labeled statement
Но еще лучше:
precision = ncPointType.StartsWith("A")?
int.Parse(Regex.Split(unitsParam.Last(), ", ")):
null;
Это выражает функцию beiong, выполняемую (заданную точность), и условия, которые управляют тем, как они установлены, даже меньше кода, - не создавая ненужных временных переменных для хранения временного результата, который больше нигде не используется.
Если вы спросите меня, что A и B - плохая практика. Вы всегда должны использовать фигурные скобки независимо от того, является ли она одной строкой или несколькими строками. Это помогает предотвратить ошибки в будущем, когда люди добавляют дополнительные строки кода в ваши блоки if или else и не замечают, что фигурные скобки отсутствуют.
Иногда с "большим" кодом, например с использованием временных переменных и т.д., Ваш код будет легче отлаживать, поскольку вы можете навешивать символы. Все дело в балансе, и это связано с опытом. Помните, что вы, возможно, не единственный, кто работает над вашим кодом, поэтому ясность прежде всего.
В основном это зависит от выбранного вами стандарта кодирования. Нет правильного или неправильного, просто личного предпочтения.
Согласитесь, как команда, что вы предпочитаете.
Легче отлаживать опцию A, но опция B более кратка, хотя она еще читаема. Вы можете сделать это еще более кратким с тернарным оператором:
precision = ncPointType.StartsWith("A") ? int.Parse(Regex.Split(unitsParam.Last(), ", ")[1]) : null;
Хотя это гораздо более читаемо таким образом (и все равно работает одинаково!):
precision = ncPointType.StartsWith("A") ?
int.Parse(Regex.Split(unitsParam.Last(), ", ")[1]) :
null;
Лучше придерживаться стандартов, используемых в вашем проекте. Читаемость гораздо важнее для удобства обслуживания, чем с меньшим количеством строк кода. В обоих вариантах эффективность одинакова, поэтому в этом случае вам не нужно беспокоиться о скорости.