面试题5:C#链表(下)

四、 ReferenceEquals, == , Equals 的关系

  首先看链表中添加链表元素的代码:

        public void Add(LKNode item)
        {
            //1
            if (item == null)
                return;
            //2
            if (Contains(item))
                return;
            else
            {//3
                item._next = HeadNode._next;
                HeadNode._next = item;
                _count++;
            }
             //4   
        }

  代码中除了检验item是否为空外,还调用了Contains(item)函数,保证要插入的元素,在链表中不存在,因为插入的元素要重新指向它的_next,如果要插入的元素已经在队列中,那么就意味着修改它的原来的_next,导致链表信息丢失。比较两个对象是否一致,我一般是使用Equa,网上查找资料后发现,还有ReferenceEqual和==两种方式(http://www.cnblogs.com/zagelover/articles/2741409.html)。

  1.ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false

  2. ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。 对于内置值类型(例如double和Double),==判断的是两个对象的代数值是否相等;对于用户定义的值类型(struct),如果没有重载==操作符,==将是不能够使用的对于引用类型,== 默认的行为与ReferenceEquals的行为相同。但是但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等

  3 Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。 Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。注意默认的,String对于声明的相同的字符串在堆上只保留一个Copy,所以s1="a a a";s2="a a a",s1和s2有相同的Reference

五、关于白盒测试测试,

  链表实现接口之后就需要测试,尝试白盒测试白盒测试,代码中//1234567表示条件为true或false时的可能路径。

        public void Insert(int index, LKNode item)
        {
            //1,2,3,4
            if (index<0||index >= _count||item==null)
                return;
            //5
            if (Contains(item))
                return;
            LKNode p = HeadNode;
            int i = 0;
            //6
            while (i < index) 
            {
                //7
                p = p._next;
                i++;
            }
            item._next=p._next;
            p._next = item;
            _count++;
        }
Insert多条件路径
1 1,2 1,2,3 1,2,3,4 1,2,3,4,5 8
            6 6,7  
            8  
Insert多条件路径编号
路径编号 路径
1 1,8
2 1,2,8
3 1,2,3,8
4 1,2,3,4,8
5 1,2,3,4,5,8
6 6,8
7 6,7,8

上面是insert函数的路径和按照白盒测试的覆盖测试法的条件组合法覆盖的路径(http://baike.baidu.com/view/51297.htm),对于1,2,3,4的或判断,有些条件组合没有意义,所以没有组合。

  对于测试的函数本来是想写一个委托事件,用来检测测试结果的,但是时间所限没有实现。大家可以参考微软的示例:http://code.msdn.microsoft.com/Events-Sample-9390aa6e 

                                                      菜包子

                                                2013年4月10日20:33:44 于宿舍

原文地址:https://www.cnblogs.com/CaiBaoZi/p/3013077.html