Наиболее эффективная / эстетическая c 3-х сторонняя логическая регистрация C# - PullRequest
1 голос
/ 05 февраля 2020

У меня есть функция C#, которая обновляет базу данных, и мне нужно проверить, чтобы убедиться, что два значения в datarow не равны NULL. Я знаю, что ValueA имеет значение чаще, чем ValueB , поэтому у меня есть следующая проверка, чтобы убедиться, что у меня наиболее эффективное выполнение (обратите внимание, использование IsNull в качестве функции для проверки C# null и DBNull.Value):

var value= DataRow["ValueA"];
        if (IsNull(value))
        {
            value= DataRow["ValueB"];
            if (IsNull(value))
            {
                _log.LogError("Error occured while attempting to update a table...");
                return;
            }
        }

Кто-нибудь может найти более эффективный способ проверить, являются ли оба значения нулевыми? Есть ли способ уменьшить количество строк кода, но сохранить эффективность?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

В конечном итоге вы делаете 2 пустые проверки, независимо от того, в каком порядке вы их выполняете, и насколько хорош ваш код. Когда это интерпретируется в IL, компилятор все равно упростит это, но с точки зрения понятного человеку кода это нормально. Альтернативой может быть не mallo c value для двух разных значений и нулевая проверка значений непосредственно как:

if(IsNull(DataRow["ValueA"]) || IsNull(DataRow["ValueB"])
{
    _log.LogError("Error occured while attempting to update a table...");
    return;
}
3 голосов
/ 05 февраля 2020

Если вы используете C# 7 или выше, вы можете использовать оператор объединения нулей , например, так:

var value = DataRow["ValueA"] ?? DataRow["ValueB"] ?? throw new Exception("Error occured while attempting to update a table...");

В сочетании с Try...Catch для перехвата исключения.

Если задействованные значения на самом деле DBNull, а не фактические null, то вы можете сделать это вместо этого (при условии, что они int? s):

var value = DataRow["ValueA"] as int? ?? DataRow["ValueB"] as int? ?? throw new Exception("Error occured while attempting to update a table...");
...