Проверка инициализации C # new() на null?
-
21-08-2019 - |
Вопрос
Я нашел этот фрагмент кода на Кодеры:
private ServiceProvider SiteServiceProvider
{
get
{
if (serviceProvider == null)
{
serviceProvider = new ServiceProvider(site as VSOLE.IServiceProvider);
Debug.Assert(serviceProvider != null, "Unable to get ServiceProvider from site object.");
}
return serviceProvider;
}
}
Мне интересно, есть ли Любой возможный способ Debug.Assert(serviceProvider != null
может сработать триггер?У меня сложилось впечатление, что new
могло быть прервано только исключением, и в этом случае утверждение никогда не было бы достигнуто.
Решение
Возможно, что ServiceProvider переопределяет оператор !=/== , так что для недействительный укажите, что сравнение с null возвращает true.
Все равно выглядит странно.
Другие советы
Я бы ожидал, что шаблон "test for null" больше, если бы это был заводской метод, т. е.
SomeType provider = SomeFactory.CreateProvider();
if(provider == null) // damn!! no factory implementation loaded...
{ etc }
Есть еще один случай, о котором стоит знать, но который здесь неприменим (поскольку мы знаем тип, который создаем)... Nullable<T>
;в основном это проблема с дженериками:
static void Test<T>() where T : new()
{
T x = new T();
if (x == null) Console.WriteLine("wtf?");
}
static void Main()
{
Test<int?>();
}
Об этом подробнее здесь.
Я согласен.Если используется обычный оператор != (унаследованный от Object), этого никогда не может произойти.Конструктор всегда возвращает ссылку на объект, и, как вы указали, если бы в конструкторе было сгенерировано исключение, точка выполнения полностью покинула бы свойство.
Я бы проверил, для чего предназначен этот код.Конструктор, конечно, мог оставить сконструированный объект в несогласованном состоянии, и это, по-видимому, то, что должно было быть протестировано.
Если ваш класс ServiceProvider реализует System.IServiceProvider , вы вполне можете захотеть проверить, чтобы убедиться, что GetService() не возвращает null .