`
bolutes
  • 浏览: 869197 次
文章分类
社区版块
存档分类
最新评论

演练:使用Visual C#创作组件

 
阅读更多

更新:2007 年 11 月

组件以对象的形式提供可重用的代码。通过创建对象并调用其属性和方法来使用组件代码的应用程序称为“客户端”。客户端与它使用的组件可能位于同一个程序集中,也可能位于不同的程序集中。

以下各个过程相互关联,因此过程的执行顺序非常重要。

说明:

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您的当前设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置

创建项目

创建 CDemoLib 类库和 CDemo 组件
  1. 在“文件”菜单中,依次选择“新建”和“项目”,以打开“新建项目”对话框。从 Visual C# 项目类型列表中选择“类库”项目模板,然后在“名称”框中输入 CDemoLib。

    说明:

    在新建项目时始终要指定该项目的名称。这样就设置了根命名空间、程序集名称和项目名称,同时确保了默认组件位于正确的命名空间中。

  2. 在“解决方案资源管理器”中,右键单击“CDemoLib”,然后从快捷菜单中选择“属性”。注意,“默认命名空间”框中包含“CDemoLib”。

    根命名空间用于限定程序集中的组件名。例如,如果两个程序集提供名为 CDemo 的组件,则可以使用 CDemoLib.CDemo 指定 CDemo 组件。

    关闭该对话框。

  3. 从“项目”菜单中选择“添加组件”。

  4. 在“添加新项”对话框中,选择“组件类”,然后在“名称”框中键入 CDemo.cs。单击“添加”以创建该组件。

    于是,一个名为 CDemo 的组件便添加到您的类库中。

  5. 在“解决方案资源管理器”中,右键单击“CDemo.cs”,然后从快捷菜单中选择“查看代码”。代码编辑器打开。

    注意紧跟在 public partial class CDemo 后面的 : Component。本节指定您的类所继承的类。默认情况下,组件从系统提供的 Component 类继承。Component 类为组件提供了许多功能,包括使用设计器的功能。

  6. 在“解决方案资源管理器”中,右键单击“Class1.cs”,然后选择“删除”。这将删除与类库一起提供的默认类,因为本演练中将不使用该类。

  7. 在“文件”菜单中,选择“全部保存”以保存项目。

添加构造函数和析构函数

构造函数控制组件的初始化方式;Finalize 方法控制组件的销毁方式。CDemo 类的构造函数和 Finalize 方法中的代码用于维护现有 CDemo 对象个数的实时计数。

添加 CDemo 类的构造函数和析构函数的代码
  1. 在“代码编辑器”中,添加成员变量以保持 CDemo 类实例的运行总计,并为每个实例添加 ID 号。

    复制代码

    public readonly int InstanceID;
    private static int NextInstanceID = 0;
    private static long ClassInstanceCount = 0;

    由于 InstanceCount 和 NextInstanceID 成员变量已声明为 static,因此它们仅存在于类级别上。所有访问这些成员的 CDemo 实例都将使用相同的内存位置。在代码中第一次引用 CDemo 类时,将对静态成员进行初始化。这可能是第一次创建 CDemo 对象,也可能是第一次访问其中的一个静态成员。

  2. 查找 public CDemo() 和 public CDemo(IContainer container),即 CDemo 类的默认构造函数。在 Visual C# 中,所有的构造函数都具有与类相同的名称。组件可以具有带有不同参数的若干构造函数,但是它们必须都具有与组件相同的名称。

    说明:

    构造函数的访问级别决定了哪些客户端能够创建该类的实例。

  3. 将下面的代码添加到 public CDemo(),以便在新建 CDemo 时递增实例计数并设置实例 ID 号。

    说明:

    始终在 InitializeComponent 调用之后添加代码。此时,任何构成组件都已初始化。

    复制代码

    InstanceID = NextInstanceID ++;
    ClassInstanceCount ++;

    作为 readonly 成员,InstanceID 只能在构造函数中设置。

    说明:

    熟悉多线程处理的用户会十分正确地指出,分配 InstanceID 和递增 NextInstanceID 应该是原子操作。这一点以及与线程有关的其他问题在 演练:使用 Visual C# 创作简单的多线程组件 中阐述。

  4. 在构造函数的结尾后面添加以下方法:

    复制代码

    ~CDemo()
    {
       ClassInstanceCount --;
    }

    此方法称为“析构函数”,通过在类名前加波浪符 (~) 表示。内存管理器在它最后回收由 CDemo 对象占用的内存之前先调用析构函数。通过实现析构函数,可以在将组件从内存移除前执行清除操作。但是,正如在本演练的随后部分所看到的,完全有理由更早释放资源。

将属性添加到类中

CDemo 类只有一个属性,它是一个静态属性,客户端使用该属性可以在任何给定时间计算内存中 CDemo 对象的个数。可以用类似的方法创建方法。

创建 CDemo 类的属性
  • 将以下属性声明添加到 CDemo 类中,以允许客户端检索 CDemo 的实例数。

    复制代码

    public static long InstanceCount
       {
          get
          {
             return ClassInstanceCount;
          }
       }

测试组件

若要测试组件,则需要一个使用该组件的项目。此项目必须是按下“运行”按钮后启动的第一个项目。

添加 CDemoTest 客户端项目作为解决方案的启动项目
  1. 在“文件”菜单中指向“添加”,然后选择“新建项目”以打开“添加新项目”对话框。

  2. 选择“Windows 应用程序”项目模板,在“名称”框中输入 CDemoTest,然后单击“确定”。

  3. 在“解决方案资源管理器”中,右键单击“CDemoTest”,然后单击快捷菜单中的“设为启动项目”。

为了使用 CDemo 组件,客户端测试项目必须具有对该类库项目的引用。添加引用后,最好将 using 语句添加到测试应用程序以简化组件的使用。

添加对类库项目的引用
  1. 在“解决方案资源管理器”中,右键单击紧跟在“CDemoTest”下方的“引用”节点,然后从快捷菜单上选择“添加引用”。

  2. 在“添加引用”对话框中,选择“项目”选项卡。

  3. 双击“CDemoLib”类库项目。“CDemoLib”将出现在“CDemoTest”项目的“引用”节点下面。

  4. 在“解决方案资源管理器”中,右键单击“Form1.cs”,然后从快捷菜单中选择“查看代码”。

通过添加对 CDemoLib 的引用,可以使用 CDemo 组件的完全限定名,即 CDemoLib.CDemo。

添加 using 语句
  • 将下面的 using 语句添加到位于 Form1 的“代码编辑器”顶部的 using 语句列表。

    复制代码

    using CDemoLib;

    通过添加 using 语句可以省略库名,并将组件类型作为 CDemo 来引用。

    现在您将创建并使用测试程序来测试您的组件。

理解对象生存期

CDemoTest 程序将通过创建和释放大量的 CDemo 对象来阐释 .NET Framework 中的对象生存期。

添加创建和释放 CDemo 对象的代码
  1. 单击“Form1.cs[Design]”返回到设计器。

  2. 将一个 Button 和一个 Timer 从“工具箱”的“所有 Windows 窗体”选项卡拖到 Form1 的设计图面上。

    非可视化的 Timer 组件出现在窗体下方一个单独的设计图面上。

  3. 双击 timer1 的图标以创建 timer1 组件的 Tick 事件的事件处理方法。将以下代码放置在事件处理方法中。

    复制代码

    this.Text = "CDemo instances: " + CDemo.InstanceCount;

    每当计时器走过一个刻度,窗体标题都显示 CDemo 类的当前实例计数。类名用作静态 InstanceCount 属性的限定符(不必通过创建 CDemo 的实例来访问静态成员)。

  4. 找到 Form1 的构造函数 (public Form1()),并在 InitializeComponent() 调用后添加下面的代码。

    复制代码

    timer1.Enabled = true;

    这样就会在创建窗体之后立即启动计时器。

  5. 单击“Form1.cs [Design]”选项卡返回到设计器。

  6. 双击 Form1 上的 Button,为该按钮的 Click 事件创建事件处理方法。将以下代码放置在事件处理方法中。

    复制代码

    CDemo cd;
    int ct;
    for (ct = 0; ct 
    
        

    此代码看起来可能很陌生。每创建一个 CDemo 实例时,前一个实例即被释放。当 for 循环完成时,将只留下一个 CDemo 实例。当事件处理方法退出时,即便是该实例也将被释放,因为变量 cd 会超出范围。

    正如您可能已经猜到的,事实并非完全如此。

运行并调试 CDemoTest 和 CDemo 项目
  1. 按 F5 键启动解决方案。

    客户端项目将启动,并显示 Form1。注意,此窗体的标题显示为“CDemo 实例:0”。

  2. 单击按钮。窗体标题应显示为“CDemo 实例:1000”。

    等到按钮的 Click 事件处理过程完成时,CDemo 的实例已全部释放。为什么它们没有被回收呢? 简言之,内存管理器在后台以较低的优先级终结对象。只有当系统的可用内存较少时,此优先级才会提高。这种“懒惰”的垃圾回收方案允许快速分配对象。

  3. 继续单击该按钮若干次,同时监视标题的变化。某些时候,实例数会骤然减少。这意味着内存管理器已经回收了某些对象的内存。

    说明:

    如果已单击了 10 次以上,而 CDemo 实例的数目尚未减少,则可能需要调整代码以使它能够使用更多的内存。关闭窗体返回到开发环境,并将 for 循环中的迭代数目增至 10000。然后再次运行项目。

  4. 重复步骤 3。这一次您会看到,在内存管理器终结更多的对象之前,实例数骤然减少的现象更加明显。

    实际上,每当您重复步骤 3 时,您都可能能够在内存管理器介入之前分配更多的 CDemo 对象。这是因为越来越多的 Visual Studio 部分被交换出来,从而为 CDemo 实例留出了更多的空间。

  5. 关闭窗体返回开发环境。

请参见

其他资源

使用组件编程

组件创作演练

分享到:
评论

相关推荐

    Visual C# 演练doc

    Visual C# 演练.doc Visual C# 演练.doc

    Visual C# 2010从入门到精通(中文版)4/4

    Visual C# 2010从入门到精通 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ISBN:...

    Visual C# 2010从入门到精通 中文版(周靖)高清.part2.rar

    Visual C# 2010从入门到精通 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ISBN:...

    攻防演练:以攻促防:企业蓝军建设思考.docx

    攻防演练:以攻促防:企业蓝军建设思考.docx

    Visual C#2010 从入门到精通 勘误

    Visual C#2010新增了大量可圈可点的丰富特性,《Visual C# 2010从入门到精通:Step by Step》围绕着基础知识和这些新特性全面介绍了如何利用Visual Studio2010和.NET Framework 4.O编写应用程序。书中沿袭深受读者...

    Visual C# 2010从入门到精通(周靖)中文版高清

    Visual C# 2010从入门到精通 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ISBN:...

    Visual C# 2010从入门到精通(中文版)2/4

    Visual C# 2010从入门到精通 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ISBN:...

    Visual C#从入门到精通.第8版.John Sharp

    C#作为微软的旗舰编程...所有练习均在VisualStudio2015简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算迁移到C#的C、C++或Java程序员,都可以从本书汲取到新的知识。迅速掌握C#编程技术.

    Visual C# 2010从入门到精通_周靖_part2

    Visual C# 2010从入门到精通(分卷2) 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ...

    Visual C# 2010从入门到精通_周靖_part1

    Visual C# 2010从入门到精通(分卷1) 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ...

    Visual C# 2010从入门到精通(中文版)1/4

    Visual C# 2010从入门到精通 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ISBN:...

    Visual C# 2010从入门到精通(中文版)3/4

    Visual C# 2010从入门到精通 基本信息 原书名:Microsoft Visual C# 2010 Step by Step 原出版社:Microsoft Press 作者:(英)John Sharp 译者:周靖 丛书名:微软技术丛书 出版社:清华大学出版社 ISBN:...

    Visual C# 2010从入门到精通

    C#作为微软的旗舰编程语言,...所有练习均在Visual Studio 2010简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算转移到C#的具有C,C++或者Java基础的程序员,都可以从本书中吸取到新的知识。

    Visual Studio 2010 C++指导教程

    Visual Studio 集成开发环境 (IDE) 提供了一组工具,可帮助您编写和修改代码,以及检测和...演练:使用项目和解决方案 (C++) 演练:生成项目 (C++) 演练:测试项目 (C++) 演练:调试项目 (C++) 演练:部署程序 (C++)

    Visual C# 2005从入门到精通 练习文件 下

    <br> Microsoft Visual C#功能强大、使用简单。本书全面介绍了如何利用Visual Studio 2005和.NET Framework来进行C#编程。作者将C#的各种特性娓娓道来,以范例导航的方式,通过大量的练习引导读者逐步构建...

    Visual C# 2008从入门到精通 中文高清版(第3部分/共6部分)

    内容简介↑visual c#作为微软的旗舰编程语言,经过几年的长足发展,在全球得以迅速普及,成为很多程序员的首选语言。visual c# 2008新增了大量可圈可点的丰富特性,本书围绕着基础知识和这些新特性全面介绍了如何...

    《Visual C#2010从入门到精通》(Visual C# 2010 Step By Step)文字版[PDF]

    书中沿袭深受读者欢迎的step...所有练习均在visual studio 2010简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。

    计算机视觉实战演练:算法与应用_思维导图1

    绪论篇主要符号表A 矩阵B 常用激活函数总结C 梯度下降法第 0 章 计算机视觉概述0.1 概述0.2 计算机视觉基本概念0.3 典型的计算机视觉任务图像分类目

    Visual C#2010从入门到精通(中文版

    C#作为微软的旗舰编程语言,...所有练习均在Visual Studio 2010简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算转移到C#的具有C,C++或者Java基础的程序员,都可以从本书中吸取到新的知识。

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    所有练习均在visual studio 2010简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,...

Global site tag (gtag.js) - Google Analytics