以下是代码:
static void Main()
{
List<string> smallList = new List<string>(new string[]{
" ",
" "});
List<List<string>> bigList = new List<List<string>>(new List<string>[]{
smallList,
getSmallList()});
if (bigList[0][0] == " ")
{
}
if (bigList[0] == smallList)
{
}
if (bigList[1] == smallList)
{
}
if (bigList[1] == getSmallList())
{
}
}
public static List<string> getSmallList()
{
List<string> list = new List<string>(new string[]{
" ",
" "});
return list;
}
第一个和第二个&#39; if&#39;陈述有效。这些都有道理。第三和第四个“如果&#39;陈述不起作用。你能帮我理解为什么不呢?
答案 0 :(得分:0)
if (bigList[0][0] == " ")
这是 true ,因为bigList[0][0]
的值也是" "
,字符串会按其值进行比较。由于它们具有相同的值,因此比较是正确的。
if (bigList[0] == smallList)
这是 true ,因为bigList[0]
指向内存中与smallList
相同的对象。它们是对同一件事的两个引用。由于它们是通过引用进行比较的,因此引用是相同的。
if (bigList[1] == smallList)
这是 false ,因为bigList[1]
不会指向内存中与smallList
相同的对象。对象以相同的方式创建,但它们是不同的对象。 (就像两辆相同的汽车仍然是不同的汽车一样。)它们通过参考进行比较,参考文献是内存中的不同实例。
if (bigList[1] == getSmallList())
这是 false ,原因与前一个相同。只有在这种情况下才更清楚,因为getSmallList()
会立即显式地在内存中创建一个对象的新实例。为了继续这个比喻,另一辆相同的汽车刚刚下线装配线。它看起来一样,但它是一辆不同的汽车。
默认情况下,对象通过引用进行比较(除非您在类定义中覆盖该功能,或提供自定义比较逻辑)。对象的任何两个实例,无论它们看起来如何直观相似,都是两个独立的实例。