检查 C# new() 初始化是否为 null?

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

3个回答

12

有可能 ServiceProvider 覆盖了 !=/== 操作符,导致对于一个 无效 状态的 null 比较返回 true。

不管怎样看起来都很奇怪。


7
我认为如果它是一个工厂方法,"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?>();
}

这个问题在这里有更详细的解释。


1
两个有趣的观点(因此+1),正如您所正确断言的那样,这里不适用。 - David Schmitt
@David - 这适用于问题标题,因此我才包括它 ;-p - Marc Gravell

3

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

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

如果您的ServiceProvider类实现了System.IServiceProvider,则很可能需要检查GetService()是否返回null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接