找回密码
 FreeOZ用户注册
查看: 1206|回复: 6
打印 上一主题 下一主题

[学习深造] System.Collections.Generic.List.ForEach

[复制链接]
跳转到指定楼层
1#
发表于 27-2-2015 13:56:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
我看不懂_version,为啥要在for loop里重复多次check啊?难道_version会变吗?


        public void ForEach(Action<T> action) {
            if( action == null) {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
            }
            Contract.EndContractBlock();

            int version = _version;

            for(int i = 0 ; i < _size; i++) {
                if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5) {
                    break;
                }
                action(_items[i]);
            }

            if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
                ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
        }
回复  

使用道具 举报

2#
发表于 27-2-2015 14:14:15 | 只看该作者
你可以看到在List.Add, List.set_this[int], List.InsertRage, List.RemoveAt里都有this._version++的code。就是说每次更改List时_version就会递增。ForEach里的version check就是每次循环检查一下是不是有其它线程更改了当前List。保持一致性。System.Collections.Generic namespace下的collection的非static操作都是线程不安全的。
回复  

使用道具 举报

3#
 楼主| 发表于 28-2-2015 19:59:10 | 只看该作者
谢谢,我没读其他代码

有没有其他类list更好,ForEach没有冗余检测操作?我写的代码不需要关心其他thread修改list
回复  

使用道具 举报

4#
发表于 1-3-2015 17:12:54 | 只看该作者
本帖最后由 finger|regnif 于 2-4-2024 14:35 编辑

回复  

使用道具 举报

5#
发表于 3-3-2015 05:28:58 | 只看该作者
finger|regnif 发表于 1-3-2015 16:12
单线程也有可能出现问题. 比如可能会写这样的看起来正确的代码:

var toRemove = myList.Where(Predicato ...

正确。在forEach里更改当前Collection本身就是bad practice,而且运行一定抛异常。
回复  

使用道具 举报

6#
发表于 3-3-2015 06:37:18 | 只看该作者
自己用for呗
回复  

使用道具 举报

7#
发表于 4-3-2015 01:58:39 | 只看该作者
这个_version看起来是从外面来的。被改变也是有可能的。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 14-8-2025 15:10 , Processed in 0.015304 second(s), 22 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表