我在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
只能被异常中止,在这种情况下永远不会达到断言。
答案 0 :(得分:12)
ServiceProvider可能会覆盖!= / ==运算符,因此对于无效状态,与null的比较将返回true。
无论如何看起来很奇怪。
答案 1 :(得分: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?>();
}
这涵盖了更多here。
答案 2 :(得分:3)
我同意。如果正在使用普通!=运算符(继承自Object),则永远不会发生这种情况。构造函数总是返回一个对象引用,正如您所指出的,如果在构造函数中抛出异常,则执行点将完全保留该属性。
我会检查这段代码的用途。当然,构造函数可以使构造的对象处于不一致的状态,这可能是应该测试的。
如果您的ServiceProvider类实现System.IServiceProvider,您可能需要检查以确保GetService()不返回null。