在編寫一些代碼來模擬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