温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#组件设计的方法有哪些

发布时间:2021-12-01 10:01:12 来源:亿速云 阅读:176 作者:iii 栏目:编程语言

本篇内容主要讲解“C#组件设计的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#组件设计的方法有哪些”吧!

在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;

到此,相信大家对“C#组件设计的方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI