C#: как выполнить нулевую проверку динамического объекта

Как выполнить проверку нуля для динамического объекта?

Псевдокод:

public void Main() {
    dynamic dynamicObject = 33;
    if(true) { // Arbitrary logic
        dynamicObject = null;
    }
    Method(dynamicObject);
}

public void Method(dynamic param) {
    // TODO: check if the content of 'param' is equal to null
}

person Seb Nilsson    schedule 11.08.2011    source источник


Ответы (4)


Вас беспокоит возможность того, что динамический объект будет иметь собственный оператор равенства, который изменит способ интерпретации null? Если это так, просто используйте Object.ReferenceEquals

if (Object.ReferenceEquals(null, param)) {
  .......
}
person JaredPar    schedule 11.08.2011
comment
@ Ани не уверен, к чему ты клонишь. - person JaredPar; 11.08.2011
comment
Вы можете просто написать ReferenceEquals(null, param). Я не могу поверить, что из ~ 5 вопросов по этой теме в SO не решили это так просто. - person Seb Nilsson; 11.08.2011
comment
@JaredPar: Поскольку все типы C#, которые могут содержать определения методов, расширяют System.Object (AFAIK), нет необходимости уточнять. (Не все так важно на самом деле.) - person Ani; 11.08.2011
comment
@Ани попался. Я предпочитаю длинную версию, потому что она снижает вероятность того, что вы привязываетесь к более локальной реализации ReferenceEquals, которая имеет другое поведение. - person JaredPar; 11.08.2011
comment
@JaredPar: Достаточно честно. Конечно, содержащий тип может содержать член с именем Object с методом экземпляра с именем ReferenceEquals с другим поведением. - person Ani; 11.08.2011
comment
@Ани однозначно. Для меня это граничит со злом, и практически каждый образец кода может быть побежден кем-то злым. - person JaredPar; 11.08.2011
comment
Я много боролся с этой проблемой и пробовал много вариантов. Это тот, который я получил лучший результат для того, что я хотел. Чисто и ясно. Спасибо!! - person Rodrigo.A92; 26.03.2020

Вы всегда можете просто сделать параметр объекта типа, это то, что делает компилятор. Когда вы вводите динамический параметр, это просто означает, что внутри этого метода используется только динамический вызов для всех применений параметра, но снаружи это просто подпись объекта типа. Более мощное использование вашего dynamicObject будет состоять в том, чтобы иметь перегрузки метода, который вы вызываете, поэтому, если вы сохраните свой пример таким же и имеете только две перегрузки, он вызовет один из двух методов на основе типа среды выполнения, и вы всегда можете добавьте больше для большего количества типов.

public void Main() {
    dynamic dynamicObject = 33;
    if(true) { // Arbitrary logic
        dynamicObject = null;
    }
    Method(dynamicObject);
}
public void Method(int param) {
  //don't have to check check null
  //only called if dynamicObject is an int
}
public void Method(object param) {
// will be called if dynamicObject is not an int or null
}
person jbtule    schedule 11.08.2011

Вы можете использовать простоту:

var s = data.servicePhoneNumber is null ? "" : data.servicePhoneNumber.Value;
person Ngô Thanh Tùng    schedule 01.11.2018

Быстрый способ может быть:

if (_owner is null)
{

}
person tedebus    schedule 02.04.2019