В C#, что происходит, когда Вы называете дополнительный метод на несуществующем объекте?

Попробуйте это

@Query("SELECT * FROM weapon_table WHERE fighter_id IN (:fighter_id)" )
LiveData<List<Weapon>> getFighterWeapons(long fighter_id);
310
задан tpower 10 May 2009 в 21:47
поделиться

6 ответов

Это нормально (без исключения). Методы расширения не используют виртуальные вызовы (т. Е. В нем используется инструкция «call» il, а не «callvirt»), поэтому проверка на null отсутствует, если вы сами не напишете ее в методе расширения. На самом деле это полезно в некоторых случаях:

public static bool IsNullOrEmpty(this string value)
{
    return string.IsNullOrEmpty(value);
}
public static void ThrowIfNull<T>(this T obj, string parameterName)
        where T : class
{
    if(obj == null) throw new ArgumentNullException(parameterName);
}

и т. Д.

По сути, вызовы статических вызовов очень буквальны - то есть

string s = ...
if(s.IsNullOrEmpty()) {...}

становится:

string s = ...
if(YourExtensionClass.IsNullOrEmpty(s)) {...}

, где явно нет проверки на null.

370
ответ дан 23 November 2019 в 01:12
поделиться

Есть несколько золотых правил, когда вы хотите, чтобы ваш текст был читабельным и вертикальным.

  • стоит сказать, что Эйфель говорит, что конкретный код, инкапсулированный в метод, должен работать против некоторого ввода, этот код работает, если выполнены некоторые предварительные условия и гарантируют ожидаемый результат

В вашем случае - DesignByContract не работает ... вы собираетесь выполнить некоторую логику с нулевым экземпляром.

-1
ответ дан 23 November 2019 в 01:12
поделиться

Метод расширения является статическим, поэтому, если вы ничего не делаете для этого MyObject, это не должно быть проблемой, быстрый тест должен проверить это :)

3
ответ дан 23 November 2019 в 01:12
поделиться

Дополнение к правильному ответу от Марка Гравелла.

Вы можете получить предупреждение от компилятора, если очевидно, что аргумент this имеет значение NULL:

default(string).MyExtension();

Хорошо работает во время выполнения, но выдает предупреждение «Выражение всегда вызывает исключение System.NullReferenceException, поскольку значение по умолчанию для строки равно NULL» .

48
ответ дан 23 November 2019 в 01:12
поделиться

Методу расширения будет передано значение null.

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

Здесь парень написал методы расширения «IsNull» и «IsNotNull», которые проверяют, передана ли ссылка null или нет. Лично я считаю, что это заблуждение, и оно не должно было появиться на свет, но это вполне корректный C #.

16
ответ дан 23 November 2019 в 01:12
поделиться

Как вы уже обнаружили, поскольку методы расширения - это просто прославленные статические методы, они будут вызываться с помощью пустые ссылки переданы без выброса NullReferenceException . Но поскольку они выглядят для вызывающего объекта как методы экземпляра, они также должны вести себя как таковые. Затем вы должны в большинстве случаев проверять параметр this и генерировать исключение, если он null . Это нормально не делать этого, если метод явно заботится о значениях null и его имя указывает на это должным образом, как в приведенных ниже примерах:

public static class StringNullExtensions { 
  public static bool IsNullOrEmpty(this string s) { 
    return string.IsNullOrEmpty(s); 
  } 
  public static bool IsNullOrBlank(this string s) { 
    return s == null || s.Trim().Length == 0; 
  } 
}

Я также написал сообщение в блоге об этом некоторое время назад.

22
ответ дан 23 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: