【问题标题】:Want some help understanding this method需要一些帮助来理解这个方法
【发布时间】:2016-02-10 22:34:16
【问题描述】:
class SetMap : KeyedCollection<Type, object>
{
    public HashSet<T> Use<T>(IEnumerable<T> sourceData)
{
    var set = new HashSet<T>(sourceData);
    if (Contains(typeof(T)))
    {
        Remove(typeof(T));
    }
    Add(set);
    return set;
}

public HashSet<T> Get <T>()
{
    return (HashSet<T>) this[typeof(T)];
}

protected override Type GetKeyForItem(object item)
{
    return item.GetType().GetGenericArguments().Single();
}
}

有人能帮我澄清一下吗? return (HashSet) this[typeof(T)];如果可能的话,举个例子。 谢谢

【问题讨论】:

  • 到目前为止,您的研究取得了哪些进展?

标签: c# keyedcollection


【解决方案1】:
return (HashSet) this[typeof(T)];

让我把声明分成几部分。

(1)this[...] 表示使用this 的索引器。而this 基本上就是“这个对象”的意思。

(2) 索引器接受Type。在对索引器的调用中,参数是typeof(T)。

(3) typeof 获取与() 中的类型对应的Type 对象。在这种情况下,泛型类型参数T。并且索引器返回一个object。

索引器的参数(Type)和返回类型(object)可以从类的基类型中推断出来:KeyedCollection&lt;Type, object&gt;。我想你可以理解这一点。

(4) 索引器返回的值被转换为HashSet&lt;T&gt;。同样,T 是泛型类型参数。

(5) 值通过return 语句返回给调用者。

更多信息:

  1. 索引器:https://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

  2. 泛型:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx

  3. 选角:https://msdn.microsoft.com/en-us/library/ms173105.aspx\

  4. KeyedCollection:https://msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx

  5. typeof:https://msdn.microsoft.com/en-us/library/58918ffs.aspx

【讨论】:

  • 感谢您的帮助,还有一个问题,我们如何知道 KeyedCollection 实现了索引器,以便我们使用“this”?还是所有集合都实现它?
  • @Abbas 我想是的。所有ICollection&lt;T&gt; 都实现了一个接受T 类型参数的索引器
【解决方案2】:

它正在使用generics。一种现代编程概念,使设计类和方法成为可能,这些类和方法可以推迟一种或多种类型的规范,直到类或方法被客户端代码声明和实例化。

在您的示例中,它定义了一个可以容纳任何类型的hashset。

阅读我提供的链接中的 MSDN 文档,如果您有更具体的问题,请在此处发布。

【讨论】:

  • 具体来说我不明白这个[typeof(T)]。这里发生了什么?
  • 它正在检查类型以查看哈希集中是否存在该类型的对象(typeof),然后将其删除。
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多