➖Возврат
null из неасинхронного метода Task/Task<T> приведет к возникновению NullReferenceException. Этой проблемы можно избежать, вернув вместо этого Task.FromResult<T>(null)// неправильно
public Task<object> GetFooAsync()
{
return null; // Noncompliant
}
// правильно так
public Task<object> GetFooAsync()
{
return Task.FromResult<object>(null);
}
➖Объединять строки в цикле лучше не через
+. Лучше использовать StringBuilder как более эффективный вариант. // можно быстрее
string str = "";
for (int i = 0; i < arrayOfStrings.Length ; ++i)
{
str = str + arrayOfStrings[i];
}
// это быстрее
StringBuilder bld = new StringBuilder();
for (int i = 0; i < arrayOfStrings.Length; ++i)
{
bld.Append(arrayOfStrings[i]);
}
string str = bld.ToString();
➖Для поиска подстрок вместо
str.Substring(startIndex).IndexOf(char1) лучше использовать один из методов: IndexOfIndexOfAnyLastIndexOfLastIndexOfAny// так не стоит
str.Substring(StartIndex).IndexOf(char1); // Noncompliant; a new string is going to be created by "Substring"
// более эффективный вариант
str.IndexOf(char1, startIndex);
➖Вместо
null во многих случаях лучше возвращать пустые массивы/коллекции, это делает код понятнее// плохая идея
public Result[] GetResults()
{
return null; // Noncompliant
}
public IEnumerable<Result> GetResults()
{
return null; // Noncompliant
}
// так намного лучше
public Result[] GetResults()
{
return new Result[0];
}
public IEnumerable<Result> GetResults()
{
return Enumerable.Empty<Result>();
}
➖Если мы делим на объект типа
int, то результатом всегда будет int; можно конечно привести этот результат к типу вещественного числа, но из-за проблем с плавающей запятой результат может быть не тем. В общем, лучше привести делимое к (decimal): decimal dec = 3/2; // 1
decimal dec = (decimal)3/2; // 1.5
Не стоит забывать эти простые рекомендации, тогда код будет чище и понятее
@csharp_ci
