漫谈Visual C#的组件设计方法
发布时间:2006-08-30 11:45:39 来源:csdn 网友评论 0 条 Properties
在C#中为类预定义属性是件再简单不过的事,见程序1。
程序1
这是相当常见的属性预定义方式,同时也是个可正常运行的程序,不过其中隐含着一个设计上的问题,那就是创建MyData对象的时机。按照程序2-1的手法,当Class1对象被创建之初,其内的_data对象也随着被创建起来,这造成了Class1对象于创建初期就付出了一个MyData对象的内存成本,这对简单的类来说或如牛毛,但倘若Class1对象中拥有一群这类属性呢?为了解决这类问题,.NET Framework中大量使用Lazy-Allocate(缓分配)技术,见程序2。
程序2 Lazy-Allocate范例
Lazy-Allocate的设计概念很简单,就是未使用前不预付成本。相对于程序2-1所使用的Pre-Allocate(预分配)概念,程序2-2采取以时间换取空间的策略,付出存取判断式的代价来减轻空间浪费的情况。当然,Pre-Allocate也不是一无是处,不须预判断的快速存取特色适用于用户必然会存取的属性,但在一些特定的属性上,例如ASP.NET中常见的Style属性就不适合使用Pre-Allocate技巧,因为用户不一定会使用该属性,于此情况下,Lazy-Allocate模式说可以让对象省下一些内存成本。
Event
事件处理是组件设计中相当重要的一环,在C#中事件与delegate是紧密相关的,程序3是一个简单的事件范例。
程序3 简单的事件范例
C#之中delegate扮演着函数指针的角色,用户可以将某个函数加入一个delegate之中,而一个delegate允许用户加入一个以上的函数,当调用此delegate时就等同于调用其内所含的所有函数。不过程序2-3的设计手法潜藏着一个问题,就是当事件数众多时,对象就必须付出相应数量的delegate变量,如程序4所示。
程序4 传统事件设计
在C#中为类预定义属性是件再简单不过的事,见程序1。
程序1
| using System; namespace PropertiesDemo { public class MyData { ............... } public class Class1 { private MyData _data; public MyData Data { get { return _data; } } public Class1() { _data = new MyData(); } } } |
这是相当常见的属性预定义方式,同时也是个可正常运行的程序,不过其中隐含着一个设计上的问题,那就是创建MyData对象的时机。按照程序2-1的手法,当Class1对象被创建之初,其内的_data对象也随着被创建起来,这造成了Class1对象于创建初期就付出了一个MyData对象的内存成本,这对简单的类来说或如牛毛,但倘若Class1对象中拥有一群这类属性呢?为了解决这类问题,.NET Framework中大量使用Lazy-Allocate(缓分配)技术,见程序2。
程序2 Lazy-Allocate范例
| public class Class1 { private MyData _data; public MyData Data { get { if(_data == null) data = new MyData(); return _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 System; namespace EventDemo { public delegate void ProcessHandler(object sender); public class Class1 { private event ProcessHandler _processHandler = null; public event ProcessHandler ProcessStart { add { _processHandler += value; } remove { _processHandler -= value; } } public void Process() { _processHandler(this); for(int 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; |
- 推荐阅讯
- Visual C# 2005快速入门之调用方法
- VC++实现显示透明的256色以上的图标
- VC#2005快速入门之使用if语句
- Visual C#泛型学习之泛型介绍
- Visual C#中用WMI编写黑客程序之简介
- 使用VC6.0实现窗口的任意分割
- VC++ 6.0中实现三叉切分窗口与多视图现
- 在Visual C#中使用XML之编写XML
- VC#2005快速入门之使用while语句
- VC#2005快速入门之复合赋值操作符
- 阅读排行
- 1.VC++编程实现广告窗口自动关闭
- 2.深入浅出VC++串口编程之基于控件
- 3.解读VC++编程中的文件操作API和CFile类
- 4.利用Visual C#实现ICMP网络协议
- 5.深入浅出VC++串口编程之第三方类
- 6.掀起你的盖头来——谈VC++对象模型
- 7.Visual C#中用WMI控制远程计算机
- 8.深入浅出VC++串口编程之基于Win32 API
- 9.Visual C++2005中开发自定义绘图控件
- 10.深入浅出VC++串口编程之基本概念
- 专题教程
- Windows Server-Windows Server文档-Windows Server新闻-Windows Ser PostgreSQL-PostgreSQL文档-PostgreSQL新闻-PostgreSQL专家
- WebLogic-WebLogic文档-WebLogic新闻-WebLogic专家 FreeBSD-FreeBSD文档-FreeBSD新闻-FreeBSD专家
- Linux-内核 GUI KDE Gnome DNS FTP 安全 安装-Linux专区 Windows-AD IIS ServerCore 虚拟化 安全 HPC-Windows专区
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
