代码之家  ›  专栏  ›  技术社区  ›  Biswanath

在.NET中使用keyedbytypeCollection?

  •  9
  • Biswanath  · 技术社区  · 17 年前

    在.NET中签出泛型集合时,我发现了keyedbytypeCollection。虽然我使用它并且知道如何使用它,但是我没有得到在哪种情况下它会有用。

    我读完了 ServiceProvider, cache etc. done with generics without cast 但不能得到太多。

    我认为,必须有一个原因来解释为什么它被包括在.NET框架中。任何使用keyedbytypecollection的主体都可以向我解释为什么使用它,或者任何主体(如果他们知道可能在哪种情况下使用它)都可以向我解释它。

    作为一种好奇心,其他语言是否支持这种类型的集合?

    3 回复  |  直到 7 年前
        1
  •  13
  •   Prensen    17 年前

    afaik,这个通用集合就像一个简单的包装器 KeyedCollection<KEY,VALUE> 什么时候? KEY VALUE 存储。

    例如,如果要实现返回单例的工厂,使用此集合非常方便:

    public class Factory<T>
    {
        private readonly KeyedByTypeCollection<T> _singletons = new KeyedByTypeCollection<T>();
    
        public V GetSingleton<V>() where V : T, new()
        {
            if (!_singletons.Contains(typeof(V)))
            {
                _singletons.Add(new V());
            }
            return (V)_singletons[typeof(V)];
        }
    }
    

    这个简单工厂的使用方法如下:

        [Test]
        public void Returns_Singletons()
        {
            Factory<ICar> factory = new Factory<ICar>();
            Opel opel1 = factory.GetSingleton<Opel>();
            Opel opel2 = factory.GetSingleton<Opel>();
    
            Assert.IsNotNull(opel1);
            Assert.IsNotNull(opel2);
            Assert.AreEqual(opel1, opel2);
        }
    

    其他用法 KeyedByTypeCollection<T> 会在服务定位器内…

        2
  •  3
  •   Hugh    13 年前

    “单件工厂”是解决单件问题的另一种方法。

    主要有三种方法:

    1. 实施一 Current Instance 每个类中的属性-表示大量重复的代码。哪一个是坏的。

    2. 实施一 Singleton<T> 基本类-意味着你可以 class A : Singleton<B> 这显然是错误的。

    3. 实施一 SingletonFactory -这是很好的记录。我大约在12个月前就想到了这一点,很惊讶地发现它在Java世界中是一个很好的主题。我为当前客户机编写的代码没有接口限制,并且是静态的,这意味着它在集合周围有一个锁以保证线程安全。如果不将其设置为静态的,则有可能得到两个类型相同、对象不同的单例。

        3
  •  0
  •   itsmysterybox    7 年前

    在分析这门课时,我认为这完全无关。使用基类 KeyedCollection 写下 GetKeyForItem 方法返回项参数的类型。

    有四种方法定义在 KeyedByTypeCollection 那是无关紧要的( Find , FindAll , Remove RemoveAll ) 查找、查找和删除所有 无底 密钥收集 实施。 去除 在基类中不存在。

    这四种方法的第一个问题是 keyedbytypecollection键 它们对基集合执行序列搜索以查找项。为什么不使用索引器 密钥收集 要检索合适的项目?

    第二, 芬德尔 移除所有 将只找到1个项(如果集合中存在一个项)-因为根据定义,集合中只存在指定类型的一个项(噢,和 芬德尔 将连续读取集合中的所有元素,即使它在开始处找到匹配的元素)。所以, 芬德尔 移除所有 将在查找/删除0或1项之前读取集合中的所有项。同样,为什么不使用索引器或基本版本的remove来执行所需的过程?

    类的第二个问题是它不是设计为基类(换句话说,除非您知道如何编写方法的内部结构,否则不要从中继承)。没有呼叫 获取密钥项 方法位于应该使用它的位置,因此,如果重写 获取密钥项 方法,还必须重写其他几个方法才能正确获取集合的键。

    推荐文章