![]() |
1
18
迭代器应该始终是等幂的,也就是说,在对队列进行迭代时不要修改它。 不能保证不会有两个并发迭代。。。 编辑以处理您的新评论: 当另一个程序员(比如你未来的self;)来为代码添加特性时,他们可能不会认为迭代器是一次性的。他们可能会添加一个日志语句,在使用它之前列出队列中的内容(oops)。 我刚刚想到的另一件事是visual studio调试器经常会枚举您的类以供显示。这会导致一些非常混乱的错误:) 如果要实现IEnumerable的子接口,并且不希望支持IEnumerable,则应抛出NotSupportedException。虽然这不会给您任何编译时警告,但运行时错误将非常明显,而奇怪的IEnumerable实现可能会浪费您今后的时间。 |
![]() |
2
12
绝对肯定的是,在迭代集合时不应该对其进行变异。整个 指向 迭代器的作用是提供集合的只读非破坏性视图。对于使用您的代码的任何人来说,查看它会改变它,这将是非常令人惊讶的。 特别地: 您不希望在调试器中检查队列的状态来更改它 . 调试器像任何其他使用者一样调用IEnumerable,如果有副作用,则执行它们。 |
![]() |
3
5
我建议您可能需要一个名为DequeueAll的方法,该方法返回一个类的项,该类的GetEnumerator方法表示队列中的所有内容,并清除队列(如果在创建iEnumerable时添加了队列项,新项应该出现在present all to AllItemsDequeued中而不是队列中,或者出现在队列中而不是当前调用中)。如果这个类实现了iEnumerable,那么它的构造方式应该使返回的对象即使在创建并释放了枚举器之后仍然有效(允许多次枚举它)。如果这样做不切实际,那么给类指定一个名称可能会很有用,该名称建议不应持久化类的对象。一个人仍然可以 foreach(QueueItem theItem in theQueue.DequeueAll()) {}但不太可能(错误地)将queue.DequeueAll的结果保存为iEnumerable。如果想要最大性能,同时允许队列的结果。DEQueLeALL都被用作IQueDebug,则可以定义一个加宽的CAST,它将对DeQueAlEALL结果进行快照(从而允许丢弃旧的项目)。 |
![]() |
4
3
我要抛开这股潮流说
对
. 这似乎是一个合理的方法。不过我得提个建议。也就是说,不要在
1个
你觉得我是怎么想到这个名字的?
2个
为什么不直接用
|
![]() |
5
2
我想说 不 ,按第二种方式操作。
这不仅与内置队列类更加一致,而且与
另外,你觉得这真的很直观吗?:
|
![]() |
6
1
严格地说,队列只提供
特别是,迭代器不是标准队列接口的一部分,因此您不需要让它们删除当前正在迭代的项。(正如其他人所指出的,这也与对迭代器的期望相矛盾。) |
![]() |
7
0
在队列中循环应该
这是为了检查队列的内容,而不是退出队列。这也是为什么
|
![]() |
8
0
我觉得不应该。它将是非常隐式的,并且不会将此意图传达给任何习惯使用.net框架的人。 |
![]() |
9
0
我要说第二个。枚举器绝对不应该更改集合的状态。 |
![]() |
10
0
我有一个代码,在这里property get不是等幂的。。。解码真是太痛苦了。请坚持手动出列。 此外,您可能不是唯一一个处理队列的人,因此它可能会与多个消费者发生冲突。 |
![]() |
lio · Java实例化Queueadt的实现 6 年前 |
![]() |
Invictus97k · c编程、队列和模块问题 6 年前 |
![]() |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 6 年前 |
![]() |
Ahsan Tarique · 队列实现错误C++[重复] 6 年前 |
![]() |
aknosis · 为多个队列共享单个laravel数据库表 6 年前 |
![]() |
T.Sh · Elastix自定义配置文件 6 年前 |