2015-09-27 36 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以獲得鍵來執行一些操作。但使用接口意味着您可以使用相同的接口而不是一種類型來存儲各種類型的類。這是解耦和更靈活