(原创)c#学习笔记09--定义类05--类库项目

9.5  类库项目

  除了在项目中把类放在不同的文件中之外,还可以把它们放在完全不同的项目中。如果一个项目什么都不包含,只包含类(以及其他相关的类型定义,但没有入口点),该项目就称为类库。

  类库项目编译为.dll 程序集,在其他项目中添加对类库项目的引用,就可以访问它的内容(这可以是同一个解决方案的一部分,但这不是必须的)。这将扩展对象提供的封装性,因为类库可以进行修改和更新,而不会影响使用它们的其他项目。这意味着,您可以方便地升级类提供的服务(这会影响多个用户应用程序)。

  下面看一个类库项目的示例和一个利用该项目包含的类的独立项目。

  (1)  在 Chapter09 目录中创建一个“类库”(Class Library)类型的新项目Ch09ClassLib,如图9-10所示。

  (2)把文件Class1.cs重命名为MyExternalClass.cs【在“解决方案资源管理器”(Solution Explorer)窗口中右击该文件,然后选择 “重命名” (Rename), 来重命名该文件名】 。 在弹出的对话框中单击 “是” (Yes)。

  (3) MyExternalClass.cs中的代码己随之自动改变,以反映类名的改变:

public class MyExternalClass
{
} 

  (4) 使用文件名MyInternalClass.cs给项目添加一个新类。

  (5) 修改代码,使类MyInternalClass成为内部类:

internal class MyInternalClass
{
}

  (6) 编译项目【注意这个项目没有入口点,所以不能像通常那样运行它——可以选择“生成 ? 生成解决方案”(Build ? Build Solution)菜单项来生成它】 。

  (7) 在\Chapter09目录中创建一个新的控制台应用程序项目Ch09Ex02。

  (8) 选择“项目 ? 添加引用”(Project ? Add Reference)菜单项,或者在“解决方案资源管理器”(Solution Explorer)窗口中右击“引用”(References),选择相同的选项。

  (9) 单击 Browse 按钮,导航到 \Chapter09\Chapter09\Ch09ClassLib\bin\Debug\,双击Ch09ClassLib.dll。

  (10) 完成了上述操作后,检查引用是否已添加到“解决方案资源管理器”(Solution Explorer)窗口中,如图9-11所示。

  (12) 修改Program.cs中的代码,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ch09ClassLib;

namespace Ch09Ex02
{
    class Program
    {
        static void Main(string[] args)
        {
            MyExternalClass myObj = new MyExternalClass();
            Console.WriteLine(myObj.ToString());
            Console.ReadKey();
        }
    }
}

  (13) 运行应用程序,其结果如图9-13所示。

  

示例的说明

  类库项目Ch09ClassLib包含两个类MyExternalClass(可公开访问)和MyInternalClass(只能在内部访问)。注意,默认情况下,会隐式将类确定为供内部访问,因为它没有访问修饰符。最好明确指定可访问性,因为这会使代码更容易理解,所以指令增加了internal关键字。

  note: 应用程序使用外部类库中定义的类时,可以把该应用程序称为库的客户应用程序。使用所定义的类的代码一般简称为客户代码。

  为了使用 Ch09ClassLib 中的类,在控制台应用程序中添加了对 Ch09ClassLib.dll 的引用。对于这个示例,该引用是指向类库的输出文件,也可以把这个文件复制到 Ch09Ex02 的本地位置上,以便继续开发类库,而不影响控制台应用程序。为了用新类库项目替换旧版本的程序集,只需用新生成的DLL文件覆盖旧文件即可。

  在添加了引用后,就可以使用对象浏览器查看可用的类。因为类MyInternalClass是内部的,所以在对象浏览器窗口中看不到这个类——它不能由外部的项目访问。但是,MyExternalClass是可供访问的,这是我们在控制台应用程序中使用的类。

  利用外面程序集中的类的技术是使用 C#和.NET Framework 编程的关键。实际上,值用.NET Framework中的任何类,也就是在利用外部程序集中的类,因为它们的处理方式是相同的。

时间: 2024-08-14 00:20:54

(原创)c#学习笔记09--定义类05--类库项目的相关文章

(原创)c#学习笔记09--定义类01--c#中的类定义

第九章 定义类 本章内容: ●  如何在C#中定义类和接口 ●  如何使用控制可访问性和继承的关键字 ●  System.Object类及其在类定义中的作用 ●  如何使用VS和VCE提供的一些帮助工具 ●  如何定义类库 ●  接口和抽象类的异同 ●  结构类型的更多内容 ●  复制对象的一些重要信息 9.1  C#中的类定义 C#使用class关键字来定义类: class MyClass { // Class members. } 默认情况下,类声明为内部的,即只有当前项目中的代码才能访问它

(原创)c#学习笔记10--定义类成员06--示例应用程序02--编写类库

10.6.2  编写类库 类和枚举都包含在一个类库项目 Ch10CardLib 中.这个项目将包含 4 个.cs 文件,Card.cs 包含Card类的定义,Deck.cs包含Deck类的定义,Suit.cs和Rank.cs文件包含枚举. 1. \Chapter10目录中创建一个新类库项目Ch10CardLib.从项目中删除Class1.cs. 2. 添加:Suit.cs和Rank.cs文件,如下所示修改: using System; using System.Collections.Gener

(原创)c#学习笔记10--定义类成员01--成员定义03--定义属性

10.1.3  定义属性 属性定义方式与字段类似,但包含的内容比多.如前所述,属性涉及的内容比字段多,是因为它们在修改状态前还可以执行一些额外的操作.实际上,它们可能并不修改状态.属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值. 这两个块也称为访问器,分别用get和set关键字来定义,可以用于控制对属性的访问级别.可以忽略其中的一个块来创建只读或只写属性(忽略get块创建只写属性,忽略set块创建只读属性).当然,这仅适用于外部代码,因为类中的其他代码可以访问这些代

(原创)c#学习笔记10--定义类成员01--成员定义05--重构成员

10.1.5  重构成员 在添加属性时有一项很方便的技术,可以从字段中生成属性在添加属性时有一项很方便的技术,可以从字段中生成属,下面是一个重构(refactoring)的示例,“重构”表示使用工具修改代码,而不是手工修改.为此,只需右击类图中的某个成员,或者在代码视图中右击某个成员即可. 例如,如果MyClass类包含如下字段: public string myString; 右击该字段,选择“重构 ? 封装字段”(Refactor ?Encapsulate Field),就会打开如图10-7

(原创)c#学习笔记10--定义类成员05--部分方法定义

10.5  部分方法定义 部分类也可以定义部分方法.部分方法在部分类中定义,但没有方法体,在另一个部分类中包含实现代码.在这两个部分类中,都要使用partial关键字. public partial class MyClass { partial void MyPartialMethod(); } public partial class MyClass { partial void MyPartialMethod() { // Method implementation } } 部分方法也可以

(原创)c#学习笔记09--定义类06--接口和抽象类

9.6  接口和抽象类 抽象类和接口都包含可以由派生类继承的成员.接口和抽象类都不能直接实例化,但可以声明这些类型的变量.如果这样做,就可以使用多态性把继承这两种类型的对象指定给它们的变量.接着通过这些变量来使用这些类型的成员,但不能直接访问派生对象的其他成员. 下面看看它们的区别.派生类只能继承一个基类,即只能直接继承一个抽象类(但可以用一个继承链包含多个抽象类).相反,类可以使用任意多个接口.但这不会产生太大的区别——这两种情况取得的效果是类似的.只是采用接口的方式略有不同. 抽象类可以拥有

(原创)c#学习笔记10--定义类成员02--类成员的其他议题02--调用重写或隐藏的基类方法

10.2.2  调用重写或隐藏的基类方法 无论是重写成员还是隐藏成员,都可以在派生类的内部访问基类成员.这在许多情况下都是很有用的,例如: 要对派生类的用户隐藏继承的公共成员,但仍能在类中访问其功能. 要给继承的虚拟成员添加实现代码,而不是简单地用重写的新执行代码替换它. 为此,可以使用 base 关键字,它表示包含在派生类中的基类的实现代码(在控制构造函数时,其用法是类似的,如第9所述),例如: public class MyBaseClass { public virtual void Do

(原创)c#学习笔记09--定义类07--结构类型

9.7  结构类型 第8章提到过结构和类非常相似,但结构是值类型,而类是引用类型.这意味着什么?最简明的方式是用一个示例来说明.代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Ch09Ex03 { class MyClass { public int val; } struct my

(原创)c#学习笔记09--定义类08--浅度和深度复制

9.8  浅度和深度复制 从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂.因为一个对象可能包含许多其他对象的引用,例如,字段成员等,这将涉及许多繁琐的操作.把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型. .NET Framework 考虑了这个问题.简单地按照成员复制对象可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法,但很容易在对象上定义一个调用该