关闭

CollectionBase类

标签: textboxbooksclassstring.net
1702人阅读 评论(1) 收藏 举报
分类:
      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是专门定义泛型集合的命名空间。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:51164次
    • 积分:775
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:18篇
    • 译文:4篇
    • 评论:14条
    最新评论