小编Dan*_*ull的帖子

为什么存在NotImplementedException?

这真的非常让我感到高兴,所以我希望有人可以给我一个合理的理由来解释为什么事情就像他们一样.

NotImplementedException. 你拉我的腿吧?

不,我不打算通过说,"坚持,方法实现 - 它会抛出NotImplementedException".是的,没错,你必须实现抛出NotImplementedException的方法(不像C++中的纯虚函数调用 - 现在才有意义!).虽然这很可笑,但在我看来还有一个更严重的问题.

我只是想知道,在存在NotImplementedException的情况下,任何人都可以用.Net做任何事情?您是否希望使用try catch块包装每个抽象方法调用以防止可能未实现的方法?如果你遇到这样的例外,你应该怎么做呢?

我认为没有办法测试一个方法是否在没有调用的情况下实际实现.因为调用它可能有副作用,我不能提前完成所有检查,然后运行我的算法.我必须运行我的算法,捕获NotImplementedExceptions以及一些如何将我的应用程序回滚到一些理智的状态.

这很疯狂.狂.疯.所以问题是: 为什么存在NotImplementedException

作为先发制人的罢工,我不希望任何人回应,"因为设计师需要将其放入自动生成的代码中." 这太可怕了.在您提供实现之前,我宁愿不编译自动生成的代码.例如,自动生成的实现可能是"throw NotImplementedException;" 其中未定义NotImplementedException!

有没有人捕获并处理过NotImplementedException?你有没有在你的代码中留下NotImplementedException?如果是这样,这是代表定时炸弹(即,你不小心将它留在那里),还是设计缺陷(该方法不应该实施,永远不会被调用)?

我也非常怀疑NotSupportedException ...不支持?什么?如果它不受支持,为什么它是你的界面的一部分?微软的任何人都可以拼写不正当的继承吗?但是如果我对这个问题没有太多的滥用,我可能会提出另一个问题.

附加信息:

是一个有趣的读物.

似乎与Brad Abrams有一个强烈的一致意见,"NotImplementedException是针对尚未实现的功能,但实际上应该(并且将会是).类似于在构建类时可能开始的内容,获取所有方法抛出NotImplementedException,然后用实际代码刷新它们......"

来自Jared Parsons的注释非常弱,应该可以忽略:NotImplementedException:当类型由于任何其他原因没有实现方法时抛出此异常.

MSDN上的主题更弱,只是说,"当一个请求的方法或操作未实现时引发的异常."

.net exception-handling exception notimplementedexception notsupportedexception

65
推荐指数
10
解决办法
6万
查看次数

使用无符号循环变量进行反向迭代

我一直在讨论与同事一起使用size_t的问题.出现的一个问题是循环,它将循环变量递减直到达到零.

请考虑以下代码:

for (size_t i = n-1; i >= 0; --i) { ... }
Run Code Online (Sandbox Code Playgroud)

由于无符号整数环绕,这会导致无限循环.在这种情况下你做什么?编写上面的代码并没有意识到你犯了一个错误似乎很容易.

我们团队的两个建议是使用以下样式之一:

for (size_t i = n-1; i != -1 ; --i) { ... }

for (size_t i = n; i-- > 0 ; ) { ... }
Run Code Online (Sandbox Code Playgroud)

但我不知道还有其他选择......

c c++

55
推荐指数
6
解决办法
1万
查看次数

.NET流功能 - CanXXX测试安全吗?

.NET中使用了一种相当常见的模式来测试类的功能.这里我将使用Stream类作为示例,但该问题适用于使用此模式的所有类.

该模式是提供一个名为CanXXX的布尔属性,以指示该类上的功能XXX可用.例如,Stream类具有CanRead,CanWrite和CanSeek属性,以指示可以调用Read,Write和Seek方法.如果属性值为false,则调用相应的方法将导致抛出NotSupportedException.

从流类的MSDN文档:

根据底层数据源或存储库,流可能仅支持其中一些功能.应用程序可以使用CanRead,CanWrite和CanSeek属性查询流的功能.

和CanRead属性的文档:

在派生类中重写时,获取一个值,指示当前流是否支持读取.

如果从Stream派生的类不支持读取,则对Read,ReadByte和BeginRead方法的调用会抛出NotSupportedException.

我看到很多代码都是按照以下方式编写的:

if (stream.CanRead)
{
    stream.Read(…)
}
Run Code Online (Sandbox Code Playgroud)

请注意,没有同步代码,例如,以任何方式锁定流对象 - 其他线程可能正在访问它或它引用的对象.也没有捕获NotSupportedException的代码.

MSDN文档未声明属性值不能随时间更改.实际上,当流关闭时,CanSeek属性会更改为false,从而演示这些属性的动态特性.因此,没有合同保证在上面的代码片段中调用Read()不会抛出NotSupportedException.

我希望有很多代码可以解决这个潜在的问题.我想知道那些发现这个问题的人是如何解决它的.这里适合哪些设计模式?

我也很感激评论这种模式的有效性(CanXXX,XXX()对).对我来说,至少在Stream类的情况下,这代表了一个试图做太多的类/接口,应该分成更基本的部分.缺乏紧密的,有文件记录的合同使测试变得不可能,实施更加困难!

.net design-patterns stream reliability

10
推荐指数
1
解决办法
1093
查看次数