Проверка параметров в методах "async" / "await" должна быть перенесена - PullRequest
0 голосов
/ 12 июня 2018

Почему SonarQube жалуется на этот код?Я читаю объяснения, но я не совсем понимаю, почему и что мне нужно сделать, чтобы это исчезло.

Ссылка на правило SonarQube

public async Task Add(SomeModel obj)
{
    if (obj == null)
    {
        throw new ArgumentNullException(nameof(obj));
    }
    var obj2 = new OtherObject();
    obj2.UpdateWith(obj);
    await _localDatabaseService.AddAsync(obj2);
}

Изменениекод, похожий на этот, не решает проблему.

public Task Add(SomeModel obj)
{
    if (obj == null)
    {
        throw new ArgumentNullException(nameof(obj));
    }
    return AddInternal(obj);
}
private async Task AddInternal(SomeModel obj)
{
    var obj2 = new OtherObject();
    obj2.UpdateWith(obj);
    await _localDatabaseService.AddAsync(i);
}

1 Ответ

0 голосов
/ 13 июня 2018

Я только что попробовал ваши примеры, и проблема не возникает в вашем втором коде (замена AddAsync(i) на AddAsync(obj2) для соответствия логике первого кода.

Что касается объяснения правила, я думаю, что веб-сайтдовольно ясно, но позвольте мне предоставить пример кода, чтобы попытаться проиллюстрировать неправильное поведение.

static async void Main(string[] args)
{
    var x = new Program().Add(null); // Exception is not raised here...

    // do some other things

    await x; // ... but here when awaited
}

Как вы видите, проблема не возникает, когда вы ожидаете.

Очевидно,если вы уверены, что НИКОГДА не окажетесь в такой ситуации и что никто не будет использовать ваш метод таким образом, вы можете отключить правило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...