我正在尝试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
_lock
o1
- 将块
o1
内部更改为,lock
o2
lock
在块内添加第二行,将 a 分配new
object
给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
实际代码中实际上发生了一些事情)?