- 接口
(1)接口是类与类之间的协议,使用接口可以使得实现接口的类或结构在形式上保持一致,是程序更加清晰和条理化,具有很好的扩展性,并可以方便实现类与类之间的统一管理,是组件技术的重要支撑。
接口把所有的方法和属性都掏空了,接口内部只有声明没有实现的代码。接口的声明语法如下:
修饰符 interface 接口名 [:父接口列表]
{
//接口体
}
例如:
Public interface IComparable
{
int ComparTo(object obj);
}
(1) 接口就是一组类或结构的一种实现形式约定。
(2) 声明接口的时候应该遵守的规则:
① 接口声明不包含数据成员;
② 接口声明只能包含成员类型为方法,属性、事件、索引的非静态成员函数;
③ 接口的函数成员声明不能包括任何代码,每个函数成员声明的主题后必须使用分号;
④ 按照惯例,接口的名称必须从大写开始;
⑤ 与类和结构相似,接口声明可以分割成分部接口声明;
⑥ 接口声明可以使用所有的访问修饰符public ,protected,internal,和private;
⑦ 接口的成员隐式为public的,不允许有任何的访问修饰符
- 接口实现
(1) C#中允许一个接口继承多个接口,例如:
interface IDataRead
{
Int GetData();
}
interface IDataWrite
{
int SetData();
}
Interface IDataI0:IDtaRead,IDataWrite
{
int TransData();
}
(2) 只有类和结构可以实现接口。要实现接口,类或者结构必须在基类列表中国包括接口名称,并且必须为每一个接口成员提供实现。例如:
interface IDataPrint
{
void PrintData(int a,int b,int c);
}
class DataPrint:IDataPrint
{
void PrintData(int a,int b,int c);
{
Console.WriteLine(“{0}/{1}/{2}”,a,b,c);
}
}
如果类从基类继承实现的接口,则基类列表中基类名称必须放在任何接口之前,C#中支持一个或结构实现多个接口,所有实现的接口必须在啊基类列表中用逗号隔开。
如果一个类实现了多个接口,并且其中一些接口有相同的签名和返回类型的成员,则类可以实现单个成员来满足所有包含重复成员的接口,也可以用过显示实现方式分别实现每个接口的成员。显示接口的实现智能通过指向接口的引用来访问(.h号修饰运算符)
3.程序集
C#中支持多问见程序结构,进行项目李开发时程序员可以使用已有的类库中的类或类型同样可以创建自己的类库,这些类库文件通常以.dll为扩展名称为程序集。使用已有的程序集和创建自己的程序集是大规模程序设计中必不可少的环节。
(1)程序集是包含一个或多个类型定义文件和资源文件的集合。在程序集包含的所有文件中,一个文件用于包含了程序集中一部分文件的名称,程序集的版本,语言文化、发布者、共有导出类型、以及组成该程序集的所有文件的程序集信息清单。程序集的结构如下图所示:
(2)程序集是.NET框架应用程序的主要的构造块。
(3)所有托管类型和资源都包含在某个程序集内,并标记为只能在该程序集的内部访问,或者标记为可以从其他程序集中的代码访问;程序集在安全方面也起着重要作用,是实施安全策略和版本策略的最小的单位。
4.命名空间
为了解决程序集和看类新房之间的命名出图问题,C#提供了使用命名空间对类型进行组织的机制。
(1) 命名空间是用来组织和重用代码的编译单元,是共享命名空间名称的一组类和类型。每个命名空间具有与其他命名空间不相同的唯一名称。
(2) 例如声明:namespace 命名空间名
{
命名空间成员
}
(3) 命名空间的成员即命名空间中包含的类和类型,命名空间中包含的所有的类的声明必须放在命名空间的大括号内
(4) 命名空间是一个字符串,该字符串可以包含“.”字符,“.”字符家在类型或类型名的前面进行信息分隔和层次组织
进行命名空间命名时,一般遵循下面的原则:
① 命名空间名称可以是任何有效的标识符
② 一般使用公司作为命名空间的开始,在公司后跟着技术名称;
③ 不要把命名空间命名为与类或类型相同的名称
④ 命名空间可以嵌套,产生嵌套的命名空间
命名空间的嵌套声明有两种形式:
一种:
namespace 命名空间1
{
命名空间1的成员
namespace 命名空间2
{
命名空间2的成员
}
}
形式二:
namespace 命名空间1
{
命名空间1的成员
}
namespace 命名空间1.命名空间2
{
}
补充:在命名空间内,每个类型名必须有别于所有的其他类型
命名空间不是封闭的,它可以在多个源文件中进行再次是声明以增加新的成员
5.using指令
为了唯一标记所使用的类和类型,需要使用包括命名空间名、分隔符以及类名的完整字符串,即类的完全限定名来完成类或类型的调用。
using指令包括using命名空间指令和using别名指令,使用using指令时必须放在文件的顶端,在所有的类型声明之前,同时using指令对源文件中的所有命名空间有效。
① using 空间指令
using命名空间指令通知编译器程序员将要使用来自某个指定命名空间的来自哪个 格式如下:
using 命名空间名;
当编译器玉带一个不再当前命名空间的名称时,它检查在using命名空间指令给出的命名空间列表,并把该未知名称加到列表中的第一个命名空间后面,如果结果完全限定名匹配了该个程序集或者引用程序集中的某一个类,编译器将使用那个类。如果不匹配,那么编译器将试验列表中的每一个命名空间,知道找到匹配的类为止
如果列表中所有的命名空间中都没有找到匹配的类,程序将会出现编译错误。因此,使用using命名空间指令后,可以通过简单类名来引用类。
② using别名指令
using别名指令允许命名空间或命名空间中的一个类型起一个别名
using 别名=命名空间名;//给命名空间起别名
using 别名=类的完全限定名;//给类型起别名
6.预处理命令
(1)源代码制定了程序的定义,预处理指令指示编译器如何处理源代码。C#中的预处理指令有编译器来处理,预处理指令作为词法分析阶段的一部分处理,并不存在单独的预处理阶段。;预处理器指令从来不会被翻译为可执行代码中的命令,但会影响编译过程的各个方面;预处理指令提供按条件跳过源文件的节、报告错误和警告条件,以及描绘源代码的不同区域的能力。在编译软件的基本版时,使用预处理器指令可以禁止编译器编译与额外功能相关的代码。在编写提供调试信息的代码时,也可以使用预处理器指令。
(2)使用预处理指令时应注意的语法规则
①预处理指令总是占用源代码的单独一行
③ 预处理指令不需要使用分号作为结尾标志
④ 预处理指令必须以#字符和预处理指令名称开头,在# 字符之前和#字符与指令之间可以有空格
⑤ 包含#define,#undef,#if,#elif,#else,#endif或#line指令的源代码可以用单行注释结束
⑥ 预定义指令既不是标记,也不是C#语法文法的组成部分。但是,可以用预处理指令包含或排除标记序列,并且可以以这种方式影响C#程序的含义。
声明指令用于定义或取消定义条件编译符号,语法形式如下:
# define 条件编译符号 //使给定的条件符号成为已定义的符号
# undef 条件编译符号 //是给定的天剑编译符号成为未定义的符号
源文件中的任何#define和#undef指令都必须位于所有“实代码”的前面,否则会发生编译错误。
#define指令可用于重复定义一个已定义的条件编译符号而不必对该符号插入任何#undef