zoukankan      html  css  js  c++  java
  • 面试题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 于宿舍

  • 相关阅读:
    Security基础(二):SELinux安全防护、加密与解密应用、扫描与抓包分析
    Security基础(一):Linux基本防护措施、使用sudo分配管理权限、提高SSH服务安全
    勤奋之致,功成之始
    Database基础(七):部署集群基础环境、MySQL-MMM架构部署、MySQL-MMM架构使用
    Database基础(六):实现MySQL读写分离、MySQL性能调优
    Database基础(五):使用binlog日志、XtraBackup备份工具、MySQL AB复制
    Database基础(四):密码恢复及设置、 用户授权及撤销、数据备份与恢复、MySQL管理工具
    Database基础(三):SQL数据导入/导出、 操作表记录、查询及匹配条件
    vue-打包上线
    vue报错-Object(...) is not a function
  • 原文地址:https://www.cnblogs.com/CaiBaoZi/p/3013077.html
Copyright © 2011-2022 走看看