java泛型:C#泛型秘诀(6)

  4.9 使用泛型创建只读集合

  问题

  您希望类中个集合里信息可以被外界访问但不希望用户改变这个集合

  解决方案

  使用ReadOnlyCollection<T>包装就很容易实现只读集合类例子如Lottery类包含了中奖号码它可以被访问但不允许被改变:

public Lottery
  {
    // 创建个列表.
    List<> _numbers = null;
    public Lottery
    {
      // 化内部列表
      _numbers = List<>(5);
      // 添加值
      _numbers.Add(17);
      _numbers.Add(21);
      _numbers.Add(32);
      _numbers.Add(44);
      _numbers.Add(58);
    }
    public ReadOnlyCollection<> Results
    {
      // 返回份包装后结果
      get { ReadOnlyCollection<>(_numbers); }
    }
}


  Lottery有个内部List<>它包含了在构造思路方法中被填中奖号码有趣部分是它有个公有属性叫Results通过返回ReadOnlyCollection<>类型可以看到其中中奖号码从而使用户通过返回例子来使用它

  如果用户试图设置集合中个值将引发个编译:

Lottery tryYourLuck = Lottery;
  // 打印结果.
  for ( i = 0; i < tryYourLuck.Results.Count; i)
  {
    Console.WriteLine("Lottery Number " + i + " is " + tryYourLuck.Results[i]);
  }
  // 改变中奖号码!
  tryYourLuck.Results[0]=29;
  //最后行引发:// Error 26 // Property or indexer
  // '.Collections.ObjectModel.ReadOnlyCollection<>.this[]'
  // cannot be assigned to -- it is read _disibledevent= KeyValuePair<,
>[numbers.Count];
  // 字典中CopyTo思路方法
  // 把字典中所有键/值对对象拷贝到objs中
  ((IDictionary)numbers).CopyTo(objs, 0);
  // 显示objs所有键/值对.
  foreach (KeyValuePair<, > kvp in objs)
  {
    Console.WriteLine("Key: " + kvp.Key + "tValue: " + kvp.Value);
}


  Dictionary对象中CopyTo思路方法需要创建个KeyValuePair<T,U>对象它用于在CopyTo思路方法被的后控制字典对象中所有KeyValuePair<T,U>对象接下来numbers字典对象被转换为IDictionary类型以CopyTo思路方法旦CopyTo思路方法被objs将包含原numbers对象中所有KeyValuePair<T,U>对象注意objs迭代时使用了foreach循环这点和numbers对象是相同

Tags:  泛型编程与stl 泛型编程 .net泛型 java泛型

延伸阅读

最新评论

发表评论