关于C#中的通用和列表mthod Contains()

时间:2018-10-17 09:17:23

标签: c#

List<Employee> staff = new List<Employee>();
Employee newHire = new Employee("John Smith", "1101");
staff.Add(newHire);
if (staff.Contains(newHire))
    Console.WriteLine("Yes the list contains the item we just added\n\t{0}", newHire.ToString());

newHire = new Employee("John Smith", "1101");
if (staff.Contains(newHire))
    Console.WriteLine("The list also contains this Employee");
else
     Console.WriteLine("Nope, can't find John Smith");

该代码用于解释Contains()的用法,但我对 实例newHire。似乎我们两次创建了此实例,但我不知道它们之间有什么区别。 我是C#的新手,英语不是我的母语。

4 个答案:

答案 0 :(得分:4)

这是发生了什么:

首先,您创建一个空列表和一个Employee类型的对象

List<Employee> staff = new List<Employee>();
Employee newHire = new Employee("John Smith", "1101");

我们现在在记忆中

  

newHire->指向地址0x00000001 //变量内容的地址示例

然后我们将其放在列表中

staff.Add(newHire);

内存

  

newHire->指向地址0x00000001

     

人员(0)->指向地址0x00000001

以下代码有效,因为两个地址相同

if (staff.Contains(newHire))
    Console.WriteLine("Yes the list contains the item we just added\n\t{0}", newHire.ToString());

现在这个小把戏

newHire = new Employee("John Smith", "1101");

这将创建一个Employee类型的新对象,其信息与第一个对象完全相同。 但这是一个新的

所以现在我们已经有了记忆

  

newHire->指向地址0x00000004 //已将新地址分配给新对象

     

人员(0)->指向地址0x00000001

以下表示“ 人员是否包含存储在地址0x00000004的对象?

if (staff.Contains(newHire))
    Console.WriteLine("The list also contains this Employee");
else
     Console.WriteLine("Nope, can't find John Smith");

当然,答案是否定的,列表仍然在0x00000001处保留对该对象的引用

答案 1 :(得分:2)

覆盖用于比较Equals个对象的Employe方法

public class Employee
{
    public string Name { get; set; }
    public string ID { get; set; }
    public Employee(string name, string id)
    {
        ID = id;
        Name = name;
    }

    public override bool Equals(object obj)
    {
        Employee item = obj as Employee;
        if (item == null)
        {
            return false;
        }
        return this.ID == item.ID && this.Name == item.Name;
    }
}

https://dotnetfiddle.net/FfoOHn

答案 2 :(得分:1)

newHire是一个变量,一个放置事物的地方。定义时会创建此空白空间:

Employee newHire

您使用'new'关键字创建Employee对象

new Employee("John Smith", "1101");

因此,这一行要做三件事,它创建了Employee,定义了一个变量来保存它,并将Employee分配给该变量。

Employee newHire = new Employee("John Smith", "1101");

然后几行后,将创建另一个Employee对象(具有相同的数据)并将其放置在同一变量中。

newHire = new Employee("John Smith", "1101");

答案 3 :(得分:0)

newHire只是一个对象变量。

它第一次引用雇员John Smith。然后将其添加到列表中。

然后,您再次将Employee John Smith分配为新对象。 一旦这样做,对第一个对象的引用就会丢失。

现在,第一个员工对象在列表内。第二个员工不在员工列表中,但由相同的newHire变量引用