9

我在Koders上找到了这段代码:

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只能被异常中止,在这种情况下永远不会达到断言。

4

3 回答 3

12

ServiceProvider 可能会覆盖 !=/== 运算符,因此对于无效状态,与 null 的比较返回 true。

总之看起来很奇怪。

于 2008-12-16T13:23:28.210 回答
7

如果它是一种工厂方法,我希望“测试空”模式更多 - 即

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

在此处进行了更多介绍。

于 2008-12-16T13:30:54.607 回答
3

我同意。如果使用普通的 != 运算符(继承自 Object),则永远不会发生这种情况。构造函数总是返回一个对象引用,正如您所指出的,如果在构造函数中抛出异常,则执行点将完全离开该属性。

我会检查这段代码的用途。当然,构造函数可能使构造的对象处于不一致的状态,这可能是应该测试的。

如果您的 ServiceProvider 类实现了 System.IServiceProvider,您可能需要检查以确保 GetService() 不返回 null。

于 2008-12-16T13:34:12.993 回答