当调用List Remove 失效时 [C#] .

有没有试过从一个集合里面移除一个对象之后,这个集合仍然留有这个对象?世界之大,无奇不有。稍有疏忽,便会导致这种奇怪的现象。现在让我们看看这个“不死”对象究竟是怎么一回事。

1、“不死”对象现身

这个问题起初是我一个同事提出的,为了重现“不死”对象,现把代码简化如下:

// Code #01

IList products = new List<Product>();
products.Add(GetProduct("1412"));
products.Remove(GetProduct("1412"));

其中 Product 类代码如下:

// Code #02

class Product
{
    public Product(string id)
    {
        m_ID = id;
    }

    private string m_ID;
    public string ID
    {
        get { return m_ID; }
    }

    public override string ToString()
    {
        return "ID: " + m_ID;
    }
}

而 GetProduct 方法则根据传入的 ID 从数据库读取数据并返回,它的签名如下:

// Code #03

public static Product GetProduct(string id);

要想知道编号为 1412 的对象是否从 products 中移除,只需在 Code #01 的最后加上这样一行:

// Code #04

Console.WriteLine(products.Count);

2、一不小心掉进陷阱

不知道你有没有查看 SDK 的习惯,其实 SDK 里面蕴藏着很多对我们解决问题有启发作用的信息的。现在让我们看看 SDK 里面能否找到什么蛛丝马迹。

由于 products 的真身是 List<T>,所以我们有必要看看 List<T> 是如何实现 IList.Remove 的:

This method determines equality using the default equality comparer EqualityComparer.Default for T, the type of values in the list.

原来,List<T> 在 IList.Remove 中使用 EqualityComparer.Default 来判断两个对象是否相等。那么 EqualityComparer.Default 又是如何得知两个对象是否相等呢?

The Default property checks whether type T implements the System.IEquatable generic interface and if so returns an EqualityComparer that uses that implementation. Otherwise it returns an EqualityComparer that uses the overrides of Object.Equals and Object.GetHashCode provided by T.

当调用List Remove 失效时 [C#] .

时间: 2024-10-22 04:11:30

当调用List Remove 失效时 [C#] .的相关文章

memcached缓存失效时的高并发访问问题解决

memcached一般用于在访问一些性能相对低下的数据接口时(如数据库),为了保证这些数据接口的稳定性,加上memcached以减少访问次数,保证这些数据接口的健壮性.一般memcached的数据都是定时失效的,当数据失效时一般会再次去访问取数据接口,然后将其更新至memcached中.这时就会有一个问题,当某个数据失效时,恰好同时有大量的客户端访问该数据,这时这些客户端都会发现该数据失效,然后都会去调用数据接口去取数据更新,这自然就瞬间地使数据接口失去了memcached的保护,有可能造成系统

Extjs中ajax请求当session失效时自动跳转

当session失效时,我们可以通过filter来拦截并重定向到登陆页面,可是请求如果是ajax请求,页面并不会重定向,这是因为ajax返回的是数据,无法返回页面. ajax异步请求不同于其他请求,其在请求头里包含有X-Requested-With:XMLHttpRequest,看下面两张图的区别. 我们可以在filter中通过它来判断一个请求是不是异步的,如果是,我们可以返回一个sessionstatus,在页面上通过判断sessionstatus的值来判断session是否失效. 第一张是普

使用List的Remove方法时想起的小问题

新建集合listA,包含5个元素. public class Student { public int Id { get; set; } public string Name { get; set; } } List<Student> listA = new List<Student>(); listA.Add(new Student() { Id = 1, Name = "yl1" }); listA.Add(new Student() { Id = 2, N

Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题

调用bootstrap css框架时,将bootstrap文件夹放入 vendor/assets/下 bootstrap文件结构如下:    [[email protected] demo]$ ls vendor/assets/bootstrap/     css  img  js [[email protected] demo]$ ls vendor/assets/bootstrap/css/     bootstrap.css  bootstrap.min.css  bootstrap-re

Cpp 调用sql server 存储过程时不返回output参数解决办法

Cpp 调用sql server 存储过程时不返回output参数,但是在ssms中调用的时候能正常返回,貌似数据库和应用代码是一切正常,再测试用c#调用也能正常获取output参数,在存储过程的的开始加上set nocount on,就能解决这个问题. 墙外原文件:点击打开链接

iframe中请求页面而session失效时页面跳转问题

iframe中请求页面而session失效时页面跳转问题 分类: Web2009-12-11 15:01 656人阅读 评论(0) 收藏 举报 sessioniframejsp 有时候做了就忘了,我记得曾经在学校里老师教过这个问题,可一时就是想不起来,不过终于搜到了这么一篇文章,先记下来以便下次再得了遗忘症. 访问相关jsp页面时,往往要先判断用户session是否失效,以便决定是继续业务,还是跳转到登录页面.这个事情我们通常是用过滤器来实现的.由过滤器判断session是否失效,由此来决定请求

JAVA调用mysql数据操作时出现错误:impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.&#39;

使用mysql做持久化报错:Cannot execute statement: impossible to write to binary log since BINLOG_FORM ActiveMQ中如果使用mysql innodb的同时,开启了binlog,那么在ack消息的时候,日志里就可会报错:java.sql.SQLException: Cannot execute statement: binlogging impossible since BINLOG_FORMAT = STATE

调用具体webservice方法时时报错误:请求因 HTTP 状态 503 失败: Service Temporarily Unavailable

添加web引用会在相应项目的app.cofig文件中产生如下代码: <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >            <section n

当自定义leftBarButtonItem(s)左边缘滑动失效时

如何开启: 1.ViewController实现 UIGestureRecognizerDelegate 协议 class YourViewController: UIGestureRecognizerDelegate { func viewDidLoad() { navigationItem.setLeftBarButtonItems([...,...]) // swipe back 失效了 self.navigationController?.interactivePopGestureRec