Проверка инициализации C # new () на ноль? - PullRequest
9 голосов
/ 16 декабря 2008

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

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 может быть прервано только исключением, в этом случае утверждение никогда не будет достигнуто.

Ответы [ 3 ]

12 голосов
/ 16 декабря 2008

Возможно, ServiceProvider переопределяет оператор! = / ==, поэтому при неверном состоянии сравнение с нулевым значением возвращает true.

В любом случае выглядит странно.

7 голосов
/ 16 декабря 2008

Я бы ожидал, что шаблон «тест на ноль» будет больше, если бы это был фабричный метод - т.е.

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?>();
}

Это покрыто более здесь .

3 голосов
/ 16 декабря 2008

Я согласен. Если используется обычный оператор! = (Унаследованный от Object), этого никогда не произойдет. Конструктор всегда возвращает ссылку на объект, и, как вы указали, если в конструкторе было сгенерировано исключение, точка выполнения полностью покинет свойство.

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

Если ваш класс ServiceProvider реализует System.IServiceProvider, вы можете проверить, чтобы GetService () не возвращал ноль.

...