面试题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 于宿舍