Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可靠性合同和IComparer(或其他注入代码)_C#_.net_Il_Reliability - Fatal编程技术网

C# 可靠性合同和IComparer(或其他注入代码)

C# 可靠性合同和IComparer(或其他注入代码),c#,.net,il,reliability,C#,.net,Il,Reliability,在编写一些代码以尽可能完整地模拟System.Array时,我遇到了一些让我感到困惑和危险的事情 使用以下方法签名: [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public static int BinarySearch<T>(T[] array, T value, IComparer<T> comparer) [可靠性合同(Consistency.WillNotCorrupt

在编写一些代码以尽可能完整地模拟System.Array时,我遇到了一些让我感到困惑和危险的事情

使用以下方法签名:

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static int BinarySearch<T>(T[] array, T value, IComparer<T> comparer)
[可靠性合同(Consistency.WillNotCorruptState,Cer.MayFail)]
公共静态整型二进制搜索(T[]数组,T值,IComparer比较器)
一个方法是通过一个合同声明的,如果出现故障,它肯定不会损坏任何国家,甚至它本身。它还意味着合同外部的一些代码将通过
比较器
值调用,并且
IComparer.Compare不需要可靠性合同;调用
comparer.Compare(x,y)
肯定会破坏状态并违反合同

这怎么有效?我不是使用强制执行的专家。。。受约束的执行环境是否会在运行时检查
Compare
方法,并在预期强制执行契约时导致异常?这是可靠性合同中的漏洞吗

或者,在非框架代码中应该避免的约束执行区域是CIL巫毒吗?我希望尽可能地保持本机System.Array的行为,因此我希望在底层实现支持的地方维护相同的
ReliabilityContract
属性;但在我看来,即使是内部构件也不能保证契约,因此我对如何保证契约感到非常困惑。

AFAIK,s是一种非常高级的功能,很少使用。除非您确实希望您的类在CER中可用(或者如果您不确定CER实际上是什么),否则不应该指定任何
ReliabilityContract

如果你还想调查CER,请阅读Stephen Toub的。我认为这篇文章最相关的部分是(我的重点):

可靠性合同也有一些有趣的解释问题。例如,CLR设计人员遇到的一个问题是,大多数实现良好的方法都会检查其参数,并对无效的输入抛出异常。因此,简单地宣布CER内的所有分配为非法的方法几乎是无用的(有些方法也可能分配,然后从任何内存不足异常中恢复)。可靠性契约试图从运行时中抽象出这种类型的细节,允许代码作者清楚地说明调用方是否需要担心故障,如果需要,需要丢弃多少状态。因此,如果传递给该方法的参数非法或该方法使用不当,则可靠性契约被视为无效。此外,可能有一些概念不容易通过合同表达出来。设想一个方法接受一个对象作为参数并调用其Equals方法此方法可能可靠,但仅当您传入具有可靠的Equals覆盖的对象时。目前还没有内置的方式来表达这一概念。

我认为突出显示的部分意味着
BinarySearch
不应该被标记为
WillNotCorruptState
。或者,委托的大小写可能比调用传入的
对象的
Equals()
更透明,因此这里的属性实际上是正确的


在任何情况下,我认为为了安全起见,您不应该指定任何
可靠性合同
s,除非您确实知道自己在做什么并且确实需要它。

您不会非常接近本机系统的行为。无论如何,数组。数组是运行时魔术-在实现泛型之前是泛型的,一旦实现泛型,魔术重定向会假装数组是某种泛型的。。。数组本身就是伏都教:P