在编写一些代码来模拟System.Array的尽可能完整的仿真时,我遇到了一些令我感到困惑和危险的东西。ReliabilityContract和IComparer(或其他注入代码)
以下方法签名:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static int BinarySearch<T>(T[] array, T value, IComparer<T> comparer)
的方法都被定义合同说,它绝对不会损坏任何状态下,即使本身,如果有故障。这也意味着合同外部的一些代码将通过comparer
值调用,而IComparer<T>.Compare
不需要可靠性合同;致电comparer.Compare(x,y)
的电话肯定会腐化国家并违反合同。
这是如何有效?我不是使用约束执行的专家......受约束的执行环境是否会在运行时检查Compare
方法,并且如果预计合同被强制执行,会导致异常?这是可靠性合同中的一个漏洞吗?
或者,我在非框架代码中应该避免的约束执行区CIL voodoo?我想尽可能保持原生System.Array的行为,所以我想在底层实现支持它的地方保持相同的属性;但在我看来,即使内部也无法保证合同,所以我很疑惑如何能保证合同。
无论如何,你不会非常接近原生System.Array的行为。数组是运行时魔术 - 泛型实现之前的泛型,魔术重定向,假装数组是通用类实现之后的通用类型...数组自身是伏都教:P – Luaan