我正在尝试lock使用以下示例来确定 .NET 代码合同如何与关键字交互:
public class TestClass
{
private object o1 = new object();
private object o2 = new object();
private void Test()
{
Contract.Requires(this.o1 != null);
Contract.Requires(this.o2 != null);
Contract.Ensures(this.o1 != null);
lock (this.o2) {
this.o1 = new object();
}
}
}
当我运行 Code Contract 静态分析工具时,它会打印一条警告:Ensures unproven: this.o1 != null
如果我这样做:
- 更改为,
o2_locko1 - 将块
o1内部更改为,locko2 lock在块内添加第二行,将 a 分配newobject给o2- 更改
lock (this.o2)为if (this.o2 != null), - 完全删除该
lock语句。
警告消失。
但是,将lock块内的行更改为var temp = new object();(从而o1从方法中删除所有引用)仍然会导致警告:
private void Test()
{
Contract.Requires(this.o1 != null);
Contract.Requires(this.o2 != null);
Contract.Ensures(this.o1 != null);
lock (this.o2) {
var temp = new object();
}
}
所以有两个问题:
- 为什么会出现此警告?
- 可以做些什么来防止它(记住这是一个玩具示例,
lock实际代码中实际上发生了一些事情)?