浅析C#组件设计的四种方法

开发 后端
C#组件设计将在这里为大家呈现四种不同的方法,希望对大家有所帮助。
C#组件设计应该注意事件处理是组件设计中相当重要的一环,在C#中事件与delegate是紧密相关的。希望本文能对C#组件设计有所帮助。

在C#中为类预定义属性是件再简单不过的事,见程序1。

程序1

  1. using System;  
  2. namespace PropertiesDemo  
  3. {  
  4.  public class MyData  
  5.    
  6.  public class Class1  
  7.  {  
  8.   private MyData _data;  
  9.   public MyData Data  
  10.   {  
  11.    get { return _data; }  
  12.   }  
  13.   public Class1()  
  14.   {  
  15.    _data = new MyData();  
  16.   }  
  17.  }  
  18. }  

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

程序2 Lazy-Allocate范例

  1. public class Class1  
  2. {  
  3.  private MyData _data;  
  4.  public MyData Data  
  5.  {  
  6.   get  
  7.   {  
  8.    if(_data == null)  
  9.     data = new MyData();  
  10.    return _data;  
  11.   }  
  12.  }  
  13.  public Class1() { }  
  14. }  

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

Event

事件处理是组件设计中相当重要的一环,在C#中事件与delegate是紧密相关的,程序3是一个简单的事件范例。

程序3 简单的事件范例

  1. using System;  
  2. namespace EventDemo  
  3. {  
  4.  public delegate void ProcessHandler(object sender);  
  5.  public class Class1  
  6.  {  
  7.   private event ProcessHandler _processHandler = null;  
  8.   public event ProcessHandler ProcessStart  
  9.   {  
  10.    add  
  11.    {  
  12.     _processHandler += value;  
  13.    }  
  14.    remove  
  15.    {  
  16.     _processHandler -= value;  
  17.    }  
  18.   }  
  19.   public void Process()  
  20.   {  
  21.    _processHandler(this);  
  22.    for(int i = 0; i < 10; i++)  
  23.     i = i+1;  
  24.   }  
  25.   public Class1()  
  26.   {}  
  27.  }  
  28. }  

C#之中delegate扮演着函数指针的角色,用户可以将某个函数加入一个delegate之中,而一个delegate允许用户加入一个以上的函数,当调用此delegate时就等同于调用其内所含的所有函数。不过程序2-3的设计手法潜藏着一个问题,就是当事件数众多时,对象就必须付出相应数量的delegate变量,如程序4所示。

程序4 传统事件设计

  1. private event ProcessHandler _processStart = null;  
  2. private event ProcessHandler _processEnd = null;  
  3. private event ProcessHandler _processStep = null;  

【编辑推荐】

  1. C#数组和指针全面讨论
  2. 简单介绍C#数组和函数
  3. C#数组初始化的应用实例解析
  4. 学习Visual C#数组速成法
  5. 浅谈C#数组工作方式
责任编辑:彭凡 来源: CSDN
相关推荐

2009-08-26 15:04:35

C#转换

2009-02-25 09:52:14

类型转换.NET 强制转型

2009-09-24 14:59:38

C#编写COM组件

2009-08-05 14:09:04

C#日期转换

2009-09-22 14:20:39

C#播放声音

2014-03-17 09:22:43

Linux命令

2022-09-02 14:29:01

JavaScrip数组属性

2009-08-20 09:52:31

C#参数类型

2009-11-23 15:57:51

PHP伪静态

2021-03-10 10:13:39

爬虫Python代码

2011-06-22 15:21:08

XML

2020-08-10 00:30:55

备份密码iPhone移动安全

2009-03-31 13:12:30

解析XMLJava

2024-10-24 08:04:00

2009-09-08 17:20:01

C#排序算法

2009-09-18 19:09:41

C# COM组件

2022-11-04 13:35:29

IT远程工作混合工作

2022-12-07 10:28:22

2020-01-21 19:15:23

漏洞安全IT

2021-09-03 11:24:04

云计算云计算环境云应用
点赞
收藏

51CTO技术栈公众号