专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » com组件设计与应用:漫谈Visual C#的组件设计思路方法 »正文

com组件设计与应用:漫谈Visual C#的组件设计思路方法

来源: 发布时间:星期五, 2009年1月9日 浏览:32次 评论:0
  Properties

  在C#中为类预定义属性是件再简单不过1

  1

using ;
PropertiesDemo
{
 public MyData
 {
  ...............
 }
 public Class1
 {
  private MyData _data;
  public MyData Data
  {
   get { _data; }
  }
  public Class1
  {
   _data = MyData;
  }
 }
}
  这是相当常见属性预定义方式同时也是个可正常运行不过其中隐含着个设计上问题那就是创建MyData对象时机按照2-1手法当Class1对象被创建的初其内_data对象也随着被创建起来这造成了Class1对象于创建初期就付出了个MyData对象内存成本这对简单类来说或如牛毛但倘若Class1对象中拥有群这类属性呢?为了解决这类问题.NET Framework中大量使用Lazy-Allocate(缓分配)技术2

  2 Lazy-Allocate范例

public Class1
{
 private MyData _data;
 public MyData Data
 {
  get
  {
   (_data null)
    data = MyData;
    _data;
  }
 }
 public Class1 { }
}
  Lazy-Allocate设计概念很简单就是未使用前不预付成本相对于2-1所使用Pre-Allocate(预分配)概念2-2采取以时间换取空间策略付出存取判断式代价来减轻空间浪费情况当然Pre-Allocate也不是无是处不须预判断快速存取特色适用于用户必然会存取属性但在些特定属性上例如ASP.NET中常见Style属性就不适合使用Pre-Allocate窍门技巧用户不定会使用该属性于此情况下Lazy-Allocate模式说可以让对象省下些内存成本

  Event

  事件处理是组件设计中相当重要在C#中事件和delegate是紧密相关3是个简单事件范例

  3 简单事件范例

using ;
EventDemo
{
 public delegate void ProcessHandler(object sender);
 public Class1
 {
  private event ProcessHandler _processHandler = null;
  public event ProcessHandler ProcessStart
  {
   add
   {
    _processHandler value;
   }
   remove
   {
    _processHandler -= value;
   }
  }
  public void Process
  {
   _processHandler(this);
   for( i = 0; i < 10; i)
    i = i+1;
  }
  public Class1
  {}
 }
}
  C#的中delegate扮演着指针角色用户可以将某个加入个delegate的中个delegate允许用户加入个以上此delegate时就等同于其内所含所有不过2-3设计手法潜藏着个问题就是当事件数众多时对象就必须付出相应数量delegate变量4所示

  4 传统事件设计

private event ProcessHandler _processStart = null;
private event ProcessHandler _processEnd = null;
private event ProcessHandler _processStep = null;
  不管用户是否用到了这些事件当对象被创建起来时就得付出这些成本这在窗口应用上更显得可怕Windows Message(窗口消息)数量以千为单位假如个简单窗口就必须付出相对于Windows Message数量变量成本这样来对象岂不成了庞然大物了针对这个问题.NET Framework采取了和Lazy-Allocate类似方式来处理5

  5 新事件设计模式

public Class1
{
 private Hashtable _eventList = Hashtable;
 private object _processStart = object;
 private object _processEnd = object;
 public event ProcessHandler ProcessStart
 {
  add
  {
   _eventList.Add(_processStart,value);
  }
  remove
  {
   _eventList.Remove(_processStart);
  }
 }
 public event ProcessHandler ProcessEnd
 {
  add
  {
   _eventList.Add(_processEnd,value);
  }
  remove
  {
   _eventList.Remove(_processEnd);
  }
 }
 public void Process
 {
  ProcessHandler start = (ProcessHandler)_eventList[_processStart];
  ProcessHandler end = (ProcessHandler)_eventList[_processEnd];
  (start != null) start(this);
   for( i = 0; i < 10; i)
    i = i+1;
    (end != null)
     end(this);
 }
  中声明了个Hashtable类型对象:_eventList个Class1类实体都拥有这个对象另外还声明了两个object类型对象:_processStart、_processEnd注意!这两个对象是(静态)类型也就是说不管有多少个对象实体都只须花费两个object空间那这和2-4范例做法有何区别呢?答案是对象所占内存大小区别当用户创建个对象实体的后此对象占用了个Hashtable对象内存空间在用户设定了ProcessStart事件时此对象随的占用了个Hashtable元素内存空间若用户未设定事件那么此元素内存空间就不会被占用相较于2-4范例预付行为此方式可以省下不必要付出内存成本再详细点说假设Class1拥有1000个事件那么2-4做法在对象创建初期就会占用1000个event变量内存空间2-5则要付出个Hashtable对象及1000个变量代价当用户创建了第 2个对象时2-4要再次占用了1000个event变量代价5只须占用个Hashtable对象代价优劣立见不是吗?很幸运这种设计概念在.NET Framework中已提供了基础建设设计人员只要套用即可6

  6 .NET Framework内建事件支持

public Component1:Component
{
 private object _processStart = object;
 public event EventHandler ProcessStart
 {
  add
  {
   Events.AddHandler(_processStart,value);
  }
  remove
  {
   Events.RemoveHandler(_processStart,value);
  }
 }
 public void Process
 {
  EventHandler handler = (EventHandler)Events[_processStart];
  (handler != null)
   handler(this,null);
 }
}
  只要继承自Component类或其子类就可使用这种方式来处理事件

  Static Helper Object

  C#是个纯OOP语言这代表着它不允许设计人员声明全局性或是变量它提倡以静态和静态变量来取代原本须要使用全局性及变量地方由于静态和静态变量都要声明于类内这个限制形成群集效应同时引出了另种类型运用:Static Helper Object7

  7 Static Helper Object范例

public sealed DoHelper
{
 public GetCurrentDoDir
 {
   AppDo.CurrentDo.BaseDirectory;
 }
 private DoHelper
 {}
}
............
MessageBox.Show(DoHelper.GetCurrentDoDir);
  DoHelper是个不允许继承且具备私有构造这代表着设计人员不可能创建或是继承此类DoHelper提供了GetCurrentDoDir静态用来返回目前Application Do所在路径这比起原来AppDo. GetCurrentDo. BaseDirectory来取得同样结果方式简短了许多Helper Object中心概念就是将常用辅助型包装成静态设计人员就无须再重复地撰写这些代码组件设计技术和Helper Object息息相关读者们会在后面章节中看到更多这类型例子

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: