Вопрос

Я нашел этот фрагмент кода на Кодеры:

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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top