C#基本概念.docx

上传人:b****1 文档编号:2326529 上传时间:2023-05-03 格式:DOCX 页数:35 大小:33.82KB
下载 相关 举报
C#基本概念.docx_第1页
第1页 / 共35页
C#基本概念.docx_第2页
第2页 / 共35页
C#基本概念.docx_第3页
第3页 / 共35页
C#基本概念.docx_第4页
第4页 / 共35页
C#基本概念.docx_第5页
第5页 / 共35页
C#基本概念.docx_第6页
第6页 / 共35页
C#基本概念.docx_第7页
第7页 / 共35页
C#基本概念.docx_第8页
第8页 / 共35页
C#基本概念.docx_第9页
第9页 / 共35页
C#基本概念.docx_第10页
第10页 / 共35页
C#基本概念.docx_第11页
第11页 / 共35页
C#基本概念.docx_第12页
第12页 / 共35页
C#基本概念.docx_第13页
第13页 / 共35页
C#基本概念.docx_第14页
第14页 / 共35页
C#基本概念.docx_第15页
第15页 / 共35页
C#基本概念.docx_第16页
第16页 / 共35页
C#基本概念.docx_第17页
第17页 / 共35页
C#基本概念.docx_第18页
第18页 / 共35页
C#基本概念.docx_第19页
第19页 / 共35页
C#基本概念.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C#基本概念.docx

《C#基本概念.docx》由会员分享,可在线阅读,更多相关《C#基本概念.docx(35页珍藏版)》请在冰点文库上搜索。

C#基本概念.docx

C#基本概念

基本概念51

3.1应用程序启动51

3.2应用程序终止52

3.3声明52

3.4成员54

3.4.1命名空间成员54

3.4.2结构成员54

3.4.3枚举成员55

3.4.4类成员55

3.4.5接口成员55

3.4.6数组成员55

3.4.7委托成员55

3.5成员访问56

3.5.1已声明可访问性56

3.5.2可访问域57

3.5.3实例成员的受保护访问59

3.5.4可访问性约束59

3.6签名和重载60

3.7范围61

3.7.1名称隐藏63

3.7.1.1通过嵌套隐藏63

3.7.1.2通过继承隐藏64

3.8命名空间和类型名称65

3.8.1完全限定名66

3.9自动内存管理67

3.10执行顺序69

1.基本概念

1.1应用程序启动

具有入口点(entrypoint)的程序集称为应用程序(application)。

应用程序运行时,将创建新的应用程序域(applicationdomain)。

同一台计算机上可能会同时运行着同一个应用程序的若干个实例,此时,每一个实例都拥有各自的应用程序域。

应用程序域通过作为应用程序状态的容器,使应用程序得以隔离。

应用程序域作为应用程序中和它使用的类库中所定义的类型的容器和边界。

同一个类型若被加载到不同的应用程序域中就成为各自独立的客体,由它们在各自应用程序域中产生的实例亦不可直接共享。

例如,对于这些类型的静态变量,每个应用程序域都有自己的副本,并且这些类型的静态构造函数在每个应用程序域中也要(最多)运行一次。

关于如何处理程序域的创建和销毁,各实现可以按具体情况确定自己的策略或机制。

当执行环境调用指定的方法(称为应用程序的入口点)时发生应用程序启动(applicationstartup)。

此入口点方法总是被命名为Main,可以具有下列签名之一:

staticvoidMain(){...}

staticvoidMain(string[]args){...}

staticintMain(){...}

staticintMain(string[]args){...}

如上所示,入口点可以选择返回一个int值。

此返回值用于应用程序终止(第3.2节)。

入口点可以包含一个形参(可选)。

该参数可以具有任意名称,但参数的类型必须为string[]。

如果存在形参,执行环境会创建并传递一个包含命令行参数的string[]实参,这些命令行参数是在启动应用程序时指定的。

string[]参数永远不能为null,但如果没有指定命令行参数,它的长度可以为零。

由于C#支持方法重载,因此类或结构可以包含某个方法的多个定义(前提是每个定义有不同的签名)。

但在一个程序内,没有任何类或结构可以包含一个以上的名为Main的方法,因为Main的定义限定它只能被用作应用程序的入口点。

允许使用Main的其他重载版本,前提是它们具有一个以上的参数,或者它们的唯一参数的类型不是string[]。

应用程序可由多个类或结构组成。

在这些类或结构中,可能会有若干个拥有自己的Main方法,因为Main的定义限定它只能被用作应用程序的入口点。

这样的情况下,必须利用某种外部机制(如命令行编译器的选项)来选择其中一个Main方法用作入口点。

在C#中,每个方法都必须定义为类或结构的成员。

通常,方法的已声明可访问性(第3.5.1节)由其声明中指定的访问修饰符(第10.2.3节)确定。

同样,类型的已声明可访问性由其声明中指定的访问修饰符确定。

为了使给定类型的给定方法可以被调用,类型和成员都必须是可访问的。

然而,应用程序入口点是一种特殊情况。

具体而言,执行环境可以访问应用程序的入口点,无论它本身的可访问性和封闭它的类型的可访问性是如何在声明语句中设置的。

在所有其他方面,入口点方法的行为与非入口点方法类似。

1.2应用程序终止

应用程序终止(applicationtermination)将控制返回给执行环境。

如果应用程序的入口点(entrypoint)方法的返回类型为int,则返回的值用作应用程序的终止状态代码(terminationstatuscode)。

此代码的用途是允许与执行环境进行关于应用程序运行状态(成功或失败)的通信。

如果入口点方法的返回类型为void,那么,到达了终止该方法的右大括号(}),或者执行不带表达式的return语句,将产生终止状态代码0。

在应用程序终止之前,将调用其中还没有被垃圾回收的所有对象的析构函数,除非这类清理功能已被设置为取消使用(例如,通过调用库方法GC.SuppressFinalize)。

1.3声明

C#程序中的声明定义程序的构成元素。

C#程序是用命名空间(第9章)组织起来的,一个命名空间可以包含类型声明和嵌套的命名空间声明。

类型声明(第9.5节)用于定义类(第10节)、结构(第11节)、接口(第13节)、枚举(第14节)和委托(第15节)。

在一个类型声明中可以使用哪些类型作为其成员,取决于该类型声明的形式。

例如,类声明可以包含常量声明(第10.3节)、字段声明(第10.4节)、方法声明(第10.5节)、属性声明(第10.6节)、事件声明(第10.7节)、索引器声明(第10.8节)、运算符声明(第10.9节)、实例构造函数声明(第10.10节)、静态构造函数声明(第10.11节)、析构函数声明(第10.12节)和嵌套的类型声明。

一个声明在它自已所属的那个声明空间(declarationspace)中定义一个名称。

除非是重载成员(第

3.6节),否则,在同一个声明空间下若有两个以上的声明语句声明了具有相同名称的成员,就会产生编译时错误。

同一个声明空间内绝不能包含不同类型的同名成员。

例如,声明空间绝不能包含同名的字段和方法。

有若干种不同类型的声明空间,如下所述。

∙在程序的所有源文件中,一个namespace-member-declaration若没有被置于任何一个namespace-declaration下,它就属于一个称为全局声明空间(globaldeclarationspace)的组合声明空间。

∙在程序的所有源文件中,一个namespace-member-declaration若在namespace-declaration中具有相同的完全限定的命名空间名称,它就属于一个组合声明空间。

∙每个类、结构或接口声明创建一个新的声明空间。

新的声明空间名称是通过class-member-declaration、struct-member-declaration或interface-member-declaration引入的。

除了重载实例构造函数声明和静态构造函数声明外,类或结构成员声明不能引入与该类或结构同名的成员。

类、结构或接口允许声明重载方法和索引器。

另外,类或结构允许重载实例构造函数和运算符的声明。

例如,类、结构或接口可以包含多个同名的方法声明,前提是这些方法声明的签名(第3.6节)不同。

注意,基类与类的声明空间无关,基接口与接口的声明空间无关。

因此,允许在派生类或接口内声明与所继承的成员同名的成员。

我们说这类成员隐藏(hide)了那些被它们所继承的成员。

∙每个枚举声明创建一个新的声明空间。

名称通过enum-member-declarations引入此声明空间。

∙每个block或switch-block,以及for、foreach和using语句,都会为局部变量和局部常量创建一个声明空间,名为局部变量声明空间(localvariabledeclarationspace)。

名称通过local-variable-declaration和local-constant-declaration引入此声明空间。

如果块是实例构造函数、方法或运算符声明的体,或是索引器声明的get或set访问器,这些声明中声明的参数是块的局部变量声明空间的成员。

如果局部变量声明空间的两个成员具有相同的名称,则会发生错误。

如果某个块的局部变量声明空间和嵌套的某个局部变量声明空间包含具有相同名称的元素,则会发生错误。

因此,在嵌套声明空间中不可能声明与封闭它的声明空间中的局部变量或常量同名的局部变量或常量。

只要两个声明空间彼此互不包含,则两个声明空间可以包含同名的元素。

∙每个block或switch-block都为标签创建一个单独的声明空间。

名称通过labeled-statement引入此声明空间,通过goto-statement语句被引用。

块的标签声明空间(labeldeclarationspace)包含任何嵌套块。

因此,在嵌套块中不可能声明与封闭它的块中的标签同名的标签。

声明名称的文本顺序通常不重要。

具体而言,声明和使用命名空间、常量、方法、属性、事件、索引器、运算符、实例构造函数、析构函数、静态构造函数和类型时,文本顺序并不重要。

在下列情况下声明顺序非常重要:

∙字段声明和局部变量声明的声明顺序确定其初始值设定项(如果有)的执行顺序。

∙在使用局部变量前必须先定义它们(第3.7节)。

∙当省略constant-expression值时,枚举成员声明(第14.3节)的声明顺序非常重要。

命名空间的声明空间是“开放式的”,两个具有相同的完全限定名的命名空间声明提供相同的声明空间。

例如

namespaceMegacorp.Data

{

classCustomer

{

...

}

}

namespaceMegacorp.Data

{

classOrder

{

...

}

}

以上两个命名空间声明提供相同的声明空间,在本示例中声明两个具有完全限定名Megacorp.Data.Customer和Megacorp.Data.Order的类。

由于两个声明共同构成同一个声明空间,因此如果每个声明中都包含一个同名类的声明,则将导致编译时错误。

正如上面所述,块的声明空间包括所有嵌套块。

因此,在下面的示例中,F和G方法导致编译时错误,因为名称i是在外部块中声明的,不能在内部块中重新声明。

但方法H和I都是有效的,因为这两个i是在单独的非嵌套块中声明的。

classA

{

voidF(){

inti=0;

if(true){

inti=1;

}

}

voidG(){

if(true){

inti=0;

}

inti=1;

}

voidH(){

if(true){

inti=0;

}

if(true){

inti=1;

}

}

voidI(){

for(inti=0;i<10;i++)

H();

for(inti=0;i<10;i++)

H();

}

}

1.4成员

命名空间和类型具有成员(member)。

通常可以通过限定名来访问实体的成员。

限定名以对实体的引用开头,后跟一个“.”标记,再接成员的名称。

类型的成员或者是在该类型中声明的,或者是从该类型的基类继承(inherit)的。

当类型从基类继承时,基类的所有成员(实例构造函数、析构函数和静态构造函数除外)都成为派生类型的成员。

基类成员的声明可访问性并不控制该成员是否可继承:

继承性可扩展到任何成员,只要它们不是实例构造函数、静态构造函数或析构函数。

然而,在派生类型中可能不能访问已被继承的成员,原因或者是因为其已声明可访问性(第3.5.1节),或者是因为它已被类型本身中的声明所隐藏(第3.7.1.2节)。

1.4.1命名空间成员

命名空间和类型若没有封闭它的命名空间,则属于全局命名空间(globalnamespace)的成员。

这直接对应于全局声明空间中声明的名称。

在某命名空间中声明的命名空间和类型是该命名空间的成员。

这直接对应于该命名空间的声明空间中声明的名称。

命名空间没有访问限制。

不可能把命名空间设置成私有的、受保护的或内部的,命名空间名称始终是可公开访问的。

1.4.2结构成员

结构的成员是在结构中声明的成员以及继承自结构的直接基类System.ValueType和间接基类object的成员。

简单类型的成员直接对应于结构类型的成员,此简单类型正是该结构的化名:

∙sbyte的成员是System.SByte结构的成员。

∙byte的成员是System.Byte结构的成员。

∙short的成员是System.Int16结构的成员。

∙ushort的成员是System.UInt16结构的成员。

∙int的成员是System.Int32结构的成员。

∙uint的成员是System.UInt32结构的成员。

∙long的成员是System.Int64结构的成员。

∙ulong的成员是System.UInt64结构的成员。

∙char的成员是System.Char结构的成员。

∙float的成员是System.Single结构的成员。

∙double的成员是System.Double结构的成员。

∙decimal的成员是System.Decimal结构的成员。

∙bool的成员是System.Boolean结构的成员。

1.4.3枚举成员

枚举的成员是在枚举中声明的常量以及继承自枚举的直接基类System.Enum和间接基类System.ValueType和object的成员。

1.4.4类成员

类的成员是在类中声明的成员和从该类的基类(没有基类的object类除外)继承的成员。

从基类继承的成员包括基类的常量、字段、方法、属性、事件、索引器、运算符和类型,但不包括基类的实例构造函数、析构函数和静态构造函数。

基类成员被是否继承与它们的可访问性无关。

类声明可以包含以下对象的声明:

常量、字段、方法、属性、事件、索引器、运算符、实例构造函数、析构函数、静态构造函数和类型。

object和string的成员直接对应于它们所化名的类类型的成员:

∙object的成员是System.Object类的成员。

∙string的成员是System.String类的成员。

1.4.5接口成员

接口的成员是在接口中和该接口的所有基接口中声明的成员。

严格地说,类object中的成员不是任何接口的成员(第13.2节)。

但是,通过在任何接口类型中进行成员查找,可获得类object中的成员(第7.3节)。

1.4.6数组成员

数组的成员是从类System.Array继承的成员。

1.4.7委托成员

委托的成员是从类System.Delegate继承的成员。

1.5成员访问

成员的声明可用于控制对该成员的访问。

成员的可访问性是由该成员的声明可访问性(第3.5.1节)和直接包含它的那个类型的可访问性(若它存在)结合起来确定的。

如果允许对特定成员进行访问,则称该成员是可访问的(accessible)。

相反,如果不允许对特定成员进行访问,则称该成员是不可访问的(inaccessible)。

当导致访问发生的源代码的文本位置包括在某成员的可访问域(第3.5.2节)中时,允许对该成员进行访问。

1.5.1已声明可访问性

成员的已声明可访问性(declaredaccessibility)可以是下列之一:

∙Public,选择它的方法是在成员声明中包括public修饰符。

public的直观含义是“访问不受限制”。

∙Protected,选择它的方法是在成员声明中包括protected修饰符。

protected的直观含义是“访问范围限定于它所属的类或从该类派生的类型”。

∙Internal,选择它的方法是在成员声明中包括internal修饰符。

internal的直观含义是“访问范围限定于此程序”。

∙Protectedinternal(意为受保护或内部的),选择它的方法是在成员声明中包括protected和internal修饰符。

protectedinternal的直观含义是“访问范围限定于此程序或那些由它所属的类派生的类型”。

∙Private,选择它的方法是在成员声明中包括private修饰符。

private的直观含义是“访问范围限定于它所属的类型”。

声明一个成员时所能选择的已声明可访问性的类型,依赖于该成员声明出现处的上下文。

此外,当成员声明不包含任何访问修饰符时,声明发生处的上下文会为该成员选择一个默认的已声明可访问性。

∙命名空间隐式地具有public已声明可访问性。

在命名空间声明中不允许使用访问修饰符。

∙编译单元或命名空间中声明的类型可以具有public或internal已声明可访问性,默认的已声明可访问性为internal。

∙类成员可具有五种已声明可访问性中的任何一种,默认为private已声明可访问性。

(请注意,声明为类成员的类型可具有五种已声明可访问性中的任何一种,而声明为命名空间成员的类型只能具有public或internal已声明可访问性。

∙结构成员可以具有public、internal或private已声明可访问性并默认为private已声明可访问性,这是因为结构是隐式地密封的。

结构的成员若是在此结构中声明的(也就是说,不是由该结构从它的基类中继承的),则不能具有protected或protectedinternal已声明可访问性。

(请注意,声明为结构成员的类型可具有public、internal或private已声明可访问性,而声明为命名空间成员的类型只能具有public或internal已声明可访问性。

∙接口成员隐式地具有public已声明可访问性。

在接口成员声明中不允许使用访问修饰符。

∙枚举成员隐式地具有public已声明可访问性。

在枚举成员声明中不允许使用访问修饰符。

1.5.2可访问域

一个成员的可访问域(accessibilitydomain)由(可能是不连续的)程序文本节组成,从那里可以访问该成员。

出于定义成员可访问域的目的,如果成员不是在某个类型内声明的,就称该成员是顶级的;如果成员是在其他类型内声明的,就称该成员是嵌套的。

此外,程序的程序文本定义为包含在该程序的所有源文件中的全部程序文本,而类型的程序文本定义为包含在该类型(可能还包括嵌套在该类型内的类型)的class-body、struct-body、interface-body或enum-body中的开始和结束(“{”和“}”)标记之间的全部程序文本。

预定义类型(如object、int或double)的可访问域是无限制的。

在程序P中声明的顶级类型T的可访问域如下定义:

∙如果T的已声明可访问性为public,则T的可访问域是P的以及引用P的任何程序的程序文本。

∙如果T的已声明可访问性为internal,则T的可访问域是P的程序文本。

从这些定义可以推断出:

顶级类型的可访问域始终至少是声明了该类型的程序的程序文本。

在程序P内的类型T中声明的嵌套成员M的可访问域如下定义(注意M本身可能就是一个类型):

∙如果M的已声明可访问性为public,则M的可访问域是T的可访问域。

∙如果M的已声明可访问性是protectedinternal,则设D表示P的程序文本和从T派生的任何类型(在P的外部声明)的程序文本的并集。

M的可访问域是T与D的可访问域的交集。

∙如果M的已声明可访问性是protected,则设D表示T的程序文本和从T派生的任何类型的程序文本的并集。

M的可访问域是T与D的可访问域的交集。

∙如果M的已声明可访问性为internal,则M的可访问域是T的可访问域与P的程序文本的交集。

∙如果M的已声明可访问性为private,则M的可访问域是T的程序文本。

从这些定义可以看出:

嵌套成员的可访问域总是至少为声明该成员的类型的程序文本。

还可以看出:

成员的可访问域包含的范围决不会比声明该成员的类型的可访问域更广。

直观地讲,当访问类型或成员M时,按下列步骤进行计算以确保允许进行访问:

∙首先,如果M是在某个类型(相对于编译单元或命名空间)内声明的,则当该类型不可访问时将会发生编译时错误。

∙然后,如果M为public,则允许进行访问。

∙否则,如果M为protectedinternal,则当访问发生在声明了M的程序中,或发生在从声明M的类派生的类中并通过派生类类型(第3.5.3节)进行访问时,允许进行访问。

∙否则,如果M为protected,则当访问发生在声明了M的类中,或发生在从声明M的类派生的类中并通过派生类类型(第3.5.3节)进行访问时,允许进行访问。

∙否则,如果M为internal,则当访问发生在声明了M的程序中时允许进行访问。

∙否则,如果M为private,则当访问发生在声明了M的类型中时允许进行访问。

∙否则,类型或成员不可访问,并发生编译时错误。

在下面的示例中

publicclassA

{

publicstaticintX;

internalstaticintY;

privatestaticintZ;

}

internalclassB

{

publicstaticintX;

internalstaticintY;

privatestaticintZ;

publicclassC

{

publicstaticintX;

internalstaticintY;

privatestaticintZ;

}

privateclassD

{

publicstaticintX;

internalstaticintY;

privatestaticintZ;

}

}

类和成员具有下列可访问域:

∙A和A.X的可访问域无限制。

∙A.Y、B、B.X、B.Y、B.C、B.C.X和B.C.Y的可访问域是包含程序的程序文本。

∙A.Z的可访问域是A的程序文本。

∙B.Z和B.D的可访问域是B的程序文本,包括B.C和B.D的程序文本。

∙B.C.Z的可访问域是B.C的程序文本。

∙B.D.X和B.D.Y的可访问域是B的程序文本,包括B.C和B.D的程序文本。

∙B.D.Z的可访问域是B.D的程序文本。

如示例所

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2