質問

これは、コード契約で装飾した簡単なグラフ操作方法です。

保証請求は証明されませんが、その理由がわかりません! remove()を呼び出した後、エッジがエッジリストにないか、結果がfalseであると主張していると思います。結果が真である場合、グラフの状態については何も主張しません。静的チェッカーはそれが好きではなく、私はペックスを手に入れていません(私はおそらくそれをどのように使用するかわからないだけです)。

この例ではロックは無関係ですが、万が一に備えて残します。また、OnremoveEdgeの代表者は保証はありませんが、今のところ、グラフコードに再入力されていないと暗黙的に想定します。その上、仮定はそれの後です。

public bool Remove(E edge)
{
  Contract.Requires(edge != null);
  Contract.Ensures(!Contract.Exists(edges, e => e == edge) || !Contract.Result<bool>());

  lock (sync)
  {
    if (!OnBeforeRemoveEdge(edge)) return false;

    if (!edges.Remove(edge)) return false;
  }

  OnRemoveEdge(edge);

  Contract.Assume(!Contract.Exists(edges, e => e == edge));

  return true;
}

更新:コードを変更して、イベントハンドラーのonRemoveEdge()を移動しました(ただし、デリゲート、onbeforeremoveEdgeではありません)。しかし、これは、スレッドに関連する契約の仮定に対して何をしますか?コード契約は単一の読み取りモデルを想定していますか?うーん。

役に立ちましたか?

解決

から 同様の質問に対するジャック・レッチの答え:

コード契約ユーザーマニュアル 「静的契約チェッカーは、まだ量子的または存在する量的なものを扱っていない」と述べています。

真実。真実。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top