C#If语句调用方法不起作用?

时间:2017-04-06 14:19:10

标签: c#

以下是代码:

    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;陈述不起作用。你能帮我理解为什么不呢?

1 个答案:

答案 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()会立即显式地在内存中创建一个对象的新实例。为了继续这个比喻,另一辆相同的汽车刚刚下线装配线。它看起来一样,但它是一辆不同的汽车。

默认情况下,对象通过引用进行比较(除非您在类定义中覆盖该功能,或提供自定义比较逻辑)。对象的任何两个实例,无论它们看起来如何直观相似,都是两个独立的实例。