CollectionBase类

原创 2006年05月22日 16:34:00
      CollectionBase 类为强类型集合提供 abstract 基类。这是MSDN上的解释,(什么叫强类型呢?引用一位Bloger上的话:所谓强类型,用简单点的话说就是可以.出来的类型,比如book.Name, book.Price。那什么又是.不出来的类型呢?自然是比较间接的类型了,比如集合、表等其他结构的类型,对于这种类型,我们只能通过其索引找出对象来,比如books[0]。也许到现在为止读者还看不出来有什么不妥的,但对于这种.不出来的类型来说,调用不直观是第一,操作多且难懂是第二,所以在某些时候很有必要将其强类型化,尤其是(也应当是)在我们知道这些.不出来的类型所拥有的结构时。可能我这样说读者都听不太明白,让我们来举个例子。很典型的例子就是当我们使用DataTable时,我们通过DataTable来保存对某一张数据表的数据,我们只用这个DataTable来保存这张数据表,那么我肯定知道这个DataTable的结构,那为什么我不能.出来呢?比如customerRow1.CustomerName?这样调用不是很方便吗?要比.不出来方便很多,而且编译时就可知道这个强类型的公开结构,不会写错,同样也可以将它当作一个真正的类型来处理(比如传递到一个专门处理它的方法),总之一句话来说就是它是可预知的,类型安全的。以下是强类型的优缺点:优点:
  1. 调用简单明了。
  2. 可预知的,类型安全的。
  3. 可以提高代码的可阅度,使代码逻辑更清晰。)

以前我们使用集合,一般实现IList集合,再内建ArrayList实现,下面这个是购物车里面的一段:

public class Cart : IEnumerable {
  private ArrayList _items = new ArrayList();

  private decimal _total=0;
  public IEnumerator GetEnumerator() {
   return _items.GetEnumerator();
  }
  public decimal Total {
   get { return _total; }
   set { _total = value; }
  }
  public int Count {
   get { return _items.Count; }
  }
  public CartItemInfo this[int index] {
   get { return (CartItemInfo)_items[index]; }
  }
  public void Add(string ItemId) {
   foreach (CartItemInfo cartItem in _items) {
    if (ItemId == cartItem.ItemId) {
     cartItem.Quantity++;
     cartItem.InStock = (GetInStock(ItemId) - cartItem.Quantity) >= 0 ? true : false;
     _total = _total+(cartItem.Price*cartItem.Quantity);
     return;
    }
   }

   Item item = new Item();

   ItemInfo data = item.GetItem(ItemId);
   CartItemInfo newItem = new CartItemInfo(ItemId,data.Name, (data.Quantity >= 1), 1, (decimal)data.Price);
   _items.Add(newItem);
   _total = _total+(data.Price);
  }

只贴了一段不完整的代码,现在再看看CollectionBase类的例子

public class textBoxArray:System.Collections.CollectionBase
 {
  private readonly System.Web.UI.Control HostPage;
  //构造函数
  public textBoxArray(System.Web.UI.Control Host)
  {
   HostPage=Host;
  }
  //addNewTextBox方法添加一个textbox控件
  public void addNewTextBox()
  {
   //this.List.Add(this.Count.ToString());

   //建一个新的textbox实例.
   TextBox aTextBox=new TextBox();
   //将其添加到集合的内部列表
   this.List.Add(aTextBox);
   //将TextBox添加到由HostForm字段引用的窗体的集合列表中
   HostPage.Controls.Add(aTextBox);
   //设置初始属性
   aTextBox.Style["Left"]=Convert.ToString((Count-1)*130+70);
   aTextBox.Style["Top"] = Convert.ToString(160);
   aTextBox.Width=120;
   aTextBox.BorderStyle=BorderStyle.Outset;
   aTextBox.ID=this.Count.ToString();
   //初始值
   aTextBox.Text="TextBox示例";
   aTextBox.ForeColor=System.Drawing.Color.Blue;
   
   
  }
  //创建索引
  public TextBox this [int index]
  {
   get
   {
    return (TextBox)this.List[index];
   }
  }
  //Remove方法用来删除控件
  public void Remove()
  {
   if(this.Count>0)
   {
    HostPage.Controls.Remove (this[this.Count -1]);
    this.List.RemoveAt(this.Count-1);
   }
  }
 }

清楚了吧,两者之间区别。CollectionBase类作为一个抽象的基类,MS提供一个这样的类确实够照顾我们的。

IList 接口  表示可按照索引单独访问的对象的非泛型集合。
ICollection 接口  定义所有非泛型集合的大小、枚举数和同步方法。

System.Collections.Generic 好象在.NET FRAMEWORK 2.0是专门定义泛型集合的命名空间。

相关文章推荐

小议CollectionBase类 C#集合类

今天看书时,对基于CollectionBase类的自定义集合有点迷惑,查了下MSDN,自己做了一些小测试,得出一些心得。 1.IEnumerator,功能:支持对非泛型集合的简单迭代,这个接口有两个...

关于CollectionBase抽象类,IEnumerable,IEnumerator以及IComparer,IComparable的实现

最近看C#语法,快被这几个东西搞混了,终究没能找到Foreach的实现根本原理,感觉现在这个水平也不需要去深究 首先来讲讲对CollectionBase的了解 这个抽象类实现了ICollectio...

JScript版的的CollectionBase类

集合是我们最常用的数据结构了,JScript虽然给我们提供了一个内部类集合对象Array,可是Array的接口调用规则并不适合我们已经习惯了的.NET Framework。为了在JScript中能方便...

Mysql映射java实体类

  • 2017年11月18日 09:55
  • 22KB
  • 下载

IO流_File类的删除功能

package cn.itcast_03; import java.io.File; import java.io.IOException; /* * 删除功能: * public boo...

写ORC 格式文件,HIVE 工具类

  • 2017年11月16日 14:48
  • 9KB
  • 下载

二维码生成类

  • 2017年11月13日 18:00
  • 5KB
  • 下载

以OLE方式读写EXCEL的C++类【转载】

◆C++中的【L"https://msdn.microsoft.com/library"】。 这个是C++标准规定的写法。详见以下链接: http://bbs.csdn.net/topics/3906...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CollectionBase类
举报原因:
原因补充:

(最多只允许输入30个字)