我一直在玩新的System.Diagnostics.Contracts类,因为它起初看起来非常有用.用于检查入站参数,返回值等的静态方法.它是一个干净的接口,可以替换许多if-then语句和内部构建的库工具.
但是,它在大多数运行时情况下似乎不太有用.据我所知,它不会引发错误,所以我无法知道合同是否失败.它会弹出一个带有错误的对话框.如果我在远程盒子上运行wcf服务,很少有人看它...我怎么知道合同失败了?如果我无法捕捉错误发生的事实,我怎么能让服务的来电者知道他们已经搞砸了?
Throw-Catch已经存在了一段时间,我不明白为什么合同想绕过这个.我试图错误地使用这个东西吗?如果是这样,那么有人会给我一个真实的情况,其中运行时契约是有意义的.肯
假设
public class MyClass
{
public int ID {get; set; }
public string Name {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和
List<MyClass> classList = //populate with MyClass instances of various IDs
Run Code Online (Sandbox Code Playgroud)
我可以
List<MyClass> result = classList.FindAll(class => class.ID == 123);
Run Code Online (Sandbox Code Playgroud)
这将给我一个ID = 123的类的列表.效果很好,看起来很优雅.
现在,如果我有
List<List<MyClass>> listOfClassLists = //populate with Lists of MyClass instances
Run Code Online (Sandbox Code Playgroud)
如何获得筛选列表本身被过滤的筛选列表.我试过了
List<List<MyClass>> result = listOfClassLists.FindAll
(list => list.FindAll(class => class.ID == 123).Count > 0);
Run Code Online (Sandbox Code Playgroud)
它看起来很优雅,但不起作用.它只包括类的列表,其中至少有一个类的ID为123,但它包含该列表中的所有MyClass实例,而不仅仅是匹配的实例.
我最终不得不这样做
List<List<MyClass>> result = Results(listOfClassLists, 123);
private List<List<MyClass>> Results(List<List<MyClass>> myListOfLists, int id)
{
List<List<MyClass>> …Run Code Online (Sandbox Code Playgroud)