将接口传递到字典键

时间:2015-09-27 02:19:21

标签: c#-4.0

我一直关注coreclr一段时间,我是编程新手。我的问题是为什么他们将接口传递给Dictionary特别是键值?

//

  • //分配一个包含旧值副本和新值的新词典。我们必须手动执行此操作

  • //最小化IEnumerators等的分配

  • //

  • 字典newValues = new Dictionary(current.m_localValues.Count +(hadPreviousValue?0:1));

我的理解是接口是由类实现的。一旦实现,它可以调用/使用函数或在类属性/变量中存储数据。 我错过了对接口及其用例的一些理解,但我不知道它是什么。

为什么要将变量实例化为接口或将接口传递给参数?我的理解是你将拥有一个变量的实例,它仍然不能保存值,也不能通过方法改变状态。

2 个答案:

答案 0 :(得分:1)

让我解释一下。

  1. 接口是合约。它只包含没有实现的方法。现在,该接口可能由任意数量的类实现。

    public interface IEntity {    int Id {get;set;} }
    
    public class Student : IEntity {    public int Id {get;set;} // Interface Property }
    
    public class Teacher : IEntity {    public int Id {get;set;} // Interface Property }
    
    Dictionary<IEntity,object> obj = new Dictionary<IEntity,object>(); Student s = new Student(); Teacher t = new Teacher(); obj.Add(s,any object); obj.Add(t,any object);
    
  2. 这是因为您的字典可以保存两种类型(学生和教师)的参考接口。

    在.NET中创建任何对象时,它由GetHashCode()方法唯一标识。 //您可以在MSDN上找到更多详细信息。

    字典也不意味着键必须只是基本类型。这就是为什么如果你有多个密钥(如数据库中的复合密钥)那么它是好的,所以它允许你根据你的自定义实现进行唯一识别。

    1. 现在是第二个Generic。

      public class PersonInfo<T> where T : IEntity
      {
      public string Name {get;set;}
      public T Entity {get;set;}
      }
      
      PersonInfo<Student> student = new PersonInfo<Student>();
      student.T = new Student();
      student.Name = "";
      
      PersonInfo<Teacher> Teacher = new PersonInfo<Teacher>();
      teacher.T=  new Teacher();
      teacher.Name = "";
      

答案 1 :(得分:0)

当你有界面时。它实际上不是接口。您始终可以使用该接口引用对象。该对象是负责字典

比较的对象

利用与使用班级作为关键并没有区别。字典可以用作列表来迭代KeyValuePair以获取键来执行某些操作。但是使用接口意味着您可以存储具有相同接口的各种类型的类,而不仅仅是一种类型。哪个是分离的,更灵活的