2015-09-27 67 views
0

我一直在关注下面的coreclr一段时间,我是编程新手。我的问题是为什么他们将接口传递到Dictionary中,尤其是关键值?将接口传递到字典键

//

  • //分配包含旧值的副本的新词典,加上新的值。我们必须手工做是为了

  • IEnumerators的//减少分配等

  • //

  • 字典newValues =新词典(current.m_localValues.Count +(hadPreviousValue 0? 1));

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

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

+0

你想问为什么使用接口而不是实现接口的类? – dotnetstep

+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); 
    

这是因为界面,你的字典可以容纳两个类型(学生和教师)的参考。

在.NET中,当任何对象被创建时,它都是由GetHashCode()方法唯一标识的。 //你可以在MSDN上找到更多细节。

Also Dictionary not means that keys must be only primitive type。如果你有多个键(比如数据库中的组合键),这就是它的好处,所以它允许你根据你的自定义实现来唯一标识。

  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 = ""; 
    
0

当你有接口。它并不实际接口。你总是有一个对象与该接口的引用。并且该对象是在字典中负责比较的那个对象

好处与使用类作为关键不同。字典可以用作列表来迭代KeyValuePair以获得键来执行一些操作。但使用接口意味着您可以使用相同的接口而不是一种类型来存储各种类型的类。这是解耦和更灵活