c # сокращение для если не ноль, тогда присвойте значение - PullRequest
1 голос
/ 07 июня 2019

Есть ли какое-либо сокращение в c # теперь, которое будет сокращать следующий код:

var testVar1 = checkObject();
if (testVar1 != null)
{
      testVar2 = testVar1;
}

В этой ситуации требуется назначать testVar2, только если testVar1 не является нулевым из результата CheckObject () (testVar2 имеет установщикэто будет запускать код).Пытался подумать, как можно использовать нуль-слитые вещи, но на самом деле не получилось.

Добавление к этому testVar2 имеет код на его установщике для запуска, поэтому не нужно, чтобы testVar2 был установлен на что-либо, если значение равно нулю.

    public MyObj testVar2
    {
        get { return _testVar2; }
        set
        {
            _testVar2 = value;
            RunSomeCode();                
        }
    }

Ответы [ 5 ]

4 голосов
/ 07 июня 2019

Есть пара!

Тернарный оператор:

testvar2 = testVar1 != null ? testvar1 : testvar2;

Будет точно такая же логика.

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

testVar2 = testVar1 ?? testVar2

(хотя теперь это тоже прокомментировано)

Или третий вариант: напишите метод один раз и используйте его так, как вам нравится:

public static class CheckIt
{
    public static void SetWhenNull(string mightBeNull,ref string notNullable)
    {
        if (mightBeNull != null)
        {
            notNullable = mightBeNull;
        }
    }
}  

И назовите это:

CheckIt.SetWhenNull(test1, ref test2);
0 голосов
/ 07 июня 2019

Не в какой-либо выпущенной в настоящее время версии (до 7.3), но это будет на C # 8.0 (он уже находится в предварительном просмотре).

Вы можете проверить статус реализации здесь иобсуждение здесь .

0 голосов
/ 07 июня 2019

Если вы не хотите, чтобы testVar2 был установлен на null, то, возможно, имеет смысл проверить null в самом сеттере. В противном случае вы должны помнить, чтобы проверять null каждый раз, когда вы пытаетесь установить его.

Обратите внимание, что я также модифицировал корпус для соответствия стандартам C #

private MyObj testVar2;

public MyObj TestVar2
{
    get { return testVar2; }
    set
    {
        if (value == null) return;      // Or throw an ArgumentNullException
        if (testVar2 == value) return;  // No need to RunSomeCode if the value isn't changing

        testVar2 = value;
        RunSomeCode();                
    }
}

Теперь, если ваша задача по-прежнему проверять null перед установкой свойства (например, если вы решили выбросить исключение в случае значения null), то с вашим исходным кодом все в порядке код (троичные / нуль-коалесцирующие решения кажутся как-то «расточительными» в том смысле, что они могут что-то устанавливать для себя), и вы можете сделать это в одной строке:

if (testVar1 != null) SomeClass.TestVar2 = testVar1;

Если, однако, вы создаете testVar1 только для того, чтобы захватить результат вызова CheckObject(), то оператор объединения нулей имеет немного больше смысла, поскольку вам не нужно создавать переменную сохранить значение:

SomeClass.TestVar2 = CheckObject() ?? SomeClass.TestVar2;
0 голосов
/ 07 июня 2019

Вы упоминаете, что testVar2 имеет установщик, который запускает некоторое событие, когда оно устанавливается.Если вы не проверяете, что testVar2 устанавливается на себя, событие будет по-прежнему запускаться с помощью оператора объединения нулей (или троичного оператора).

Я думаю, вам придется либо проверить testVar2 быть настроенным на себя в своем установщике, или делать то, что вы делаете сейчас.

    public MyObj testVar2
    {
        get { return _testVar2; }
        set
        {
            if (_testVar2 != value)
            {
               _testVar2 = value;
               RunSomeCode();
            }                
        }
    }

Я считаю, что это полностью мое мнение но я бы оставил это, как у вас сейчас,Я думаю, что он передает намерение лучше, чем короткая рука.

testVar2 = testVar1 ?? tesrVar2 говорит: «установите testVar2 на testVar1. Если testVar1 не равен нулю. Затем установите testVar2 на testVar2».

if (testVar1 != null)
{
   testVar2 = testVar1;
}

говорит: «если testVar1 не равно нулю, установите testVar2 в testVar1».

0 голосов
/ 07 июня 2019

Вы можете использовать нуль-коалесцирующий оператор , который будет выглядеть так: testVar2 = testVar1 ?? testVar2. Вы можете заменить ?? testVar2 тем, что хотите установить, если testVar1 равно нулю.

...