Tag: design by contract

ReSharper – 使用Microsoft.Contracts时可能的空分配

有什么方法可以向ReSharper表明由于devise合同需要检查而不会出现空引用? 例如,下面的代码将在第7和第8行的ReSharper中提出警告( Possible 'null' assignment to entity marked with 'NotNull' attribute ): private Dictionary<string, string> _Lookup = new Dictionary<string, string>(); public void Foo(string s) { Contract.Requires(!String.IsNullOrEmpty(s)); if (_Lookup.ContainsKey(s)) _Lookup.Remove(s); } 真奇怪的是,如果你删除了Contract.Requires(…)行,ReSharper消息就会消失。 更新 我通过ExternalAnnotationsfind了解决scheme,Mike在下面也提到了这个解决scheme。 下面是一个如何为Microsoft.Contracts中的函数实现的示例: 在ExternalAnnotations ReSharper目录下创build一个名为Microsoft.Contracts的目录。 接下来,创build一个名为Microsoft.Contracts.xml的文件并像下面这样填充: <assembly name="Microsoft.Contracts"> <member name="M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean)"> <attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/> <parameter name="condition"> <attribute ctor="M:JetBrains.Annotations.AssertionConditionAttribute.#ctor(JetBrains.Annotations.AssertionConditionType)"> <argument>0</argument> </attribute> </parameter> </member> </assembly> 重新启动Visual Studio,消息消失!

多less空值检查就足够了?

什么是什么是什么时候没有必要检查一个空值的准则? 最近我一直在努力的很多inheritance代码都有一些空的检查。 对平凡的函数进行空值检查,对调用非空返回值的API调用进行空检查等。在某些情况下,空检查是合理的,但是在很多地方,空值不是合理的期望值。 我听说过一些论据,从“你不能相信其他代码”到“总是防守”到“直到语言保证我是一个非空值,我总是要去检查”。 我当然同意这些原则中的许多原则,但是我发现过多的空值检查会导致通常违反这些原则的其他问题。 顽强的空检查真的值得吗? 通常情况下,我已经观察到过多的空值检查代码实际上质量较差,而不是质量较高。 大部分代码似乎都非常关注空值检查,因此开发人员忽略了其他重要的特性,例如可读性,正确性或exception处理。 特别是,我看到很多代码忽略了std :: bad_allocexception,但对new进行了空检查。 在C ++中,由于解引用空指针的不可预知的行为,我在某种程度上理解了这一点; 在Java,C#,Python等中,空解除引用是比较优雅的处理。我刚才看到了一些缺乏警惕的空值检查的例子吗?或者真的有这个东西吗? 这个问题的目的是语言不可知的,虽然我主要感兴趣的是C ++,Java和C#。 我已经看到的一些空检查的例子似乎过多,包括: 这个例子似乎是占了非标准的编译器,因为C ++规范说,失败的新引发exception。 除非您明确支持不符合规范的编译器,否则这是否有意义? 在Java或C#(甚至是C ++ / CLR)这样的托pipe语言中,这是否有意义? try { MyObject* obj = new MyObject(); if(obj!=NULL) { //do something } else { //??? most code I see has log-it and move on //or it repeats what's in the exception […]