`

C#基础题

阅读更多

把attribute翻译成特性,用来标识类,方法
把property翻译为属性,性质,用于存取类的字段
把markup翻译成标记,tag还是翻译成标签比较好

.NET Framework的核心是其运行库的执行环境。
称为公共语言运行库(CLR)或.NET运行库.
通常将在CLR的控制下运行的代码称为托管代码(managed code).
在CLR执行开发的源代码之前,需要编译它们为中间语言(IL),CLR再把IL编译为平台专用的代码。

程序集(assembly)是包含编译好的,面向.NET Framework的代码的逻辑单元.
可执行代码和库代码使用相同的程序集结构.
程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法.

ASP页面有时显示比较慢,因为服务器端代码是解释性的不是编译的.
由于ASP代码不是结构化的所以难于维护,加上ASP不支持错误处理和语法检查。
而ASP.NET页面是结构化的。每个页面都是一个继承了.NET类System.Web.UI.Page的类。
另外ASP.NET的后台编码功能允许进一步采用结构化的方式.
页面请求是和WEB服务器在编译后高速缓存ASP.NET页面。

1. 覆盖(override)和重载(overload):
覆盖是指子类重新定义父类的虚函数的做法。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
其实,重载的概念并不属于“面向对象编程”,
重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰
然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。
如,有两个同名函数:function    func(p:integer):integer;    和function  func(p:string):integer;。
那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。
对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。
也就是说,它们的地址在编译期就绑定了(早绑定),
因此,重载和多态无关!真正和多态相关的是“覆盖”。
当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,
这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。
因此,这样的函数地址是在运行期绑定的(晚邦定)。
结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!

2. C#中ref和out的区别:
方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
当希望方法返回多个值时,声明 out 方法非常有用。
使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
属性不是变量,不能作为 out 参数传递。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。
当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。
ref 参数的值被传递到 ref 参数。 传递到 ref 参数的参数必须最先初始化。
将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
属性不是变量,不能作为 ref 参数传递。

两者都是按地址传递的,使用后都将改变原来的数值。
ref可以把参数的数值传递进函数,但是out是要把参数清空
就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
两个的区别:ref是有进有出,out是只出不进。

3. ADO和ADO.NET的区别:
ADO使用OLE DB接口并基于微软的COM技术
而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。
ADO以Recordset存储,而ADO.NET则以DataSet表示。
Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接。
反之,DataSet可以是多个表的集合。ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的。
ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本
ADO.NET的数据库连接也只有在这段时间需要在线。

由于ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范
而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提高了整体性能。
ADO.NET为.NET构架提供了优化的数据访问模型,和基于COM的ADO是完全两样的数据访问方式。

ado.net与ado存在着比较大的差异:
1.ado.net遵循更通用的原则,不那么专门面向数据库。
ado.net集合了所有允许数据处理的类。这些类表示具有典型数据库功能(如索引,排序和视图)的数据容器对象。
尽管ado.net是.net数据库应用程序的权威解决方案
但从总体设计上看,它不像ado数据模型那样以数据库为中心,这是ado.net的一大特点。
2.目前,ado.net提供了两种数据库访问类库:一种用于sql server 7.0 或更高版本
另一种用于其他所有您可能已经安装的ole db提供程序。
在这两种情况下,您分别使用不同的类,但遵循相似的命名规则。
除前缀,名称都是相同的。前一种情况前缀为sql,后一种情况则是oledb。
同时,.net框架还提供了odbc .net的数据访问模式。
odbc .net data provider是 .net 框架的增强组件,它可以访问原始的 odbc 驱动程序
就像 ole db .net data provider 可以访问原始的 ole db providers 一样。
目前它仅在下列驱动程序中测试过:
microsoft sql odbc driver,microsoft odbc driver for oracle,microsoft jet odbc driver。
3.ado.net提供了两个队形来处理从数据源中抽取数据,它们是dataset和datareader对象。
前者是记录在内存中的缓存,您可以从任何方向随意访问和修改。
后者是高度优化的对象,专为以仅向前方式滚动只读记录而设计。
4.ado.net统一了数据容器类编程接口,无论您打算编写何种应用程序,windows窗体,web窗体还是web服务
都可以通过同一组类来处理数据。
不管在后端的数据源数sql server数据库,ole db,xml文件还是一个数组
您都可以通过相同的方法和属性来滚动和处理它们的内容。
5.在ado中,xml只不过是输入和输出格式。
然而在ado.net中,xml是一种数据格式,提供了操作,组织,共享和传递数据的手段。

4. ADO。NET相对于ADO等主要有什么改进?
1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,
2:不使用com
3:不在支持动态游标和服务器端游
4:,可以断开connection而保留当前数据集可用
5:强类型转换
6:xml支持

5.new 关键字用法
(1)new  运算符  用于创建对象和调用构造函数。
(2)new  修饰符  用于向基类成员隐藏继承成员。
(3)new  约束  用于在泛型声明中约束可能用作类型参数的参数的类型。
 指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。

6.C#中,string str = null 与 string str ="",说明区别。
string str =""初始化对象分配空间
而string str=null初始化对象

7. DataGrid的Datasouse可以连接什么数据源
DataTable DataView  DataSet  DataViewManager 任何实现IListSource接口的组件  任何实现IList接口的组件

8. 概述反射和序列化
反射:公共语言运行库加载器管理应用程序域。
 这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
 程序集包含模块,而模块包含类型,类型又包含成员。
 反射则提供了封装程序集、模块和类型的对象。
 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。
 然后,可以调用类型的方法或访问其字段和属性。

序列化:序列化是将对象状态转换为可保持或传输的格式的过程。
 与序列化相对的是反序列化,它将流转换为对象。
 这两个过程结合起来,可以轻松地存储和传输数据。

9.可访问性级别有哪几种
 public 访问不受限制。
 protected 访问仅限于包含类或从包含类派生的类型。
 internal 访问仅限于当前程序集。
 protected internal 访问仅限于从包含类派生的当前程序集或类型。
 private 访问仅限于包含类型。

10. O/R Mapping 的原理:利用反射,配置将对象和数据库表映射。

11.sealed 修饰符有什么特点?
sealed 修饰符表示密封,用于类时,表示该类不能再被继承
不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥
用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用
因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员

12 .详述.NET里class和struct的异同
结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:
尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。
实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。
结构不能从类或其他结构继承。
结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。
复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。
由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。
C# 中的所有值类型本质上都继承自 ValueType,后者继承自 Object。
编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

结构具有以下特点:
结构是值类型,而类是引用类型。
向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
与类不同,结构的实例化可以不使用 new 运算符。
结构可以声明构造函数,但它们必须带参数。
一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
结构可以实现接口。
在结构中初始化实例字段是错误的。

类与结构的差别
1. 值类型与引用类型
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型
例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型
类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高
可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注:
1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上
 如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承
 虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
例如:结构实现接口
interface IImage
{
 void Paint();
}
struct Picture : IImage
{
 public void Paint()
 {
  // painting code goes here
 }
 private int x, y, z; // other struct members
}

3.内部结构:
结构:
没有默认的构造函数,但是可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化
在结构中初始化实例字段是错误的
类:
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用new 初始化

[.NET(C#)]
如何选择结构还是类 
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2. 结构表示如点、矩形和颜色这样的轻量对象
 例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。
 在此情况下,结构的成本较低。
3. 在表现抽象和多级别的对象层次时,类是最好的选择
4. 大多数情况下该类型只是一些数据时,结构时最佳的选择

13.abstract class和interface有什么区别?
答:声明方法的存在而不去实现它的类被叫做抽像类(abstract class)
它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。
不能创建abstract 类的实例。
然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。
不能有抽像构造函数或抽像静态方法。
Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类。
取而代之,在子类中实现该方法。
知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽像类的变体。
在接口中,所有方法都是抽像的。
多继承性可通过实现这样的接口而获得。
接口中的所有方法都是抽像的,没有一个有程序体。
接口只可以定义static final成员变量。
接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。

当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。
然后,它可以在实现了该接口的类的任何对像上调用接口的方法。
由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。
引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

接口可以继承接口。
抽像类可以实现(implements)接口
抽像类是否可继承实体类(concrete class),但前提是实体类必须有明确的构造函数。

14 什么叫应用程序域?什么是托管代码?什么是强类型系统?
什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?

应用程序域:
应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。
应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。
应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。
应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

托管代码:
使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有许多优点,
例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。

装箱和拆箱:
从值类型接口转换到引用类型:装箱。
从引用类型转换到值类型:拆箱。
装箱和拆箱使值类型能够被视为对象。
对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。
这使得值类型可以存储于垃圾回收堆中。
拆箱将从对象中提取值类型。

重载:
每个类型成员都有一个唯一的签名。
方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。
只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。
当定义两种或多种具有相同名称的方法时,就称作重载。

CTS通用类型系统 (common type system) :
一种确定公共语言运行库如何定义、使用和管理类型的规范。

CLR公共语言运行库:
.NET Framework 提供了一个称为公共语言运行库的运行时环境.
它运行代码并提供使开发过程更轻松的服务。

CLS公共语言规范:
要和其他对象完全交互,而不管这些对象是以何种语言实现的.
对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。
为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。

强类型:
C# 是强类型语言;因此每个变量和对象都必须具有声明类型。

15. 值类型和引用类型的区别?
基于值类型的变量直接包含值。
将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

所有的值类型均隐式派生自 System.ValueType。
与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。
每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
值类型主要由两类组成:结构、枚举
结构分为以下几类:
Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。
引用类型的变量又称为对象,可存储对实际数据的引用。
声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string

                     值类型                    引用类型
 
内存分配地点      分配在栈中                   分配在堆中
效率           效率高,不需要地址转换          效率低,需要进行地址转换
内存回收        使用完后,立即回收              使用完后,不是立即回收,等待GC回收
赋值操作         进行复制,创建一个同值新对象    只是对原有对象的引用
函数参数与返回值  是对象的复制                  是原有对象的引用,并不产生新的对象
类型扩展   不易扩展    容易扩展,方便与类型扩展

16 如何理解委托
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

17. C#中的接口和类有什么异同。
异:
不能直接实例化接口。
接口不包含方法的实现。
接口、类和结构可从多个接口继承。
但是C# 只支持单继承:类只能从一个基类继承实现。
类定义可在不同的源文件之间进行拆分。

同:
接口、类和结构可从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口可以包含事件、索引器、方法和属性。
一个类可以实现多个接口。

18. ASP.net的身份验证方式有哪些
Windows 身份验证提供程序
提供有关如何将 Windows 身份验证与 Microsoft Internet 信息服务 (IIS) 身份验证
结合使用来确保 ASP.NET 应用程序安全的信息。

Forms 身份验证提供程序
提供有关如何使用您自己的代码创建应用程序特定的登录窗体并执行身份验证的信息。
使用 Forms 身份验证的一种简便方法是使用 ASP.NET 成员资格和 ASP.NET 登录控件
它们一起提供了一种只需少量或无需代码就可以收集、验证和管理用户凭据的方法。

Passport 身份验证提供程序
提供有关由 Microsoft 提供的集中身份验证服务的信息,该服务为成员站点提供单一登录和核心配置

19. 活动目录的作用
Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。
Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。

20. 解释一下UDDI、WSDL的意义及其作用
UDDI:统一描述、发现和集成协议(UDDI, Universal Description, Discovery and Integration)
是一套基于Web的、分布式的、为Web服务提供的信息注册中心的实现标准规范,
同时也包含一组使企业能将自身提供的Web服务注册以使得别的企业能够发现的访问协议的实现标准。
UDDI 提供了一组基于标准的规范用于描述和发现服务,还提供了一组基于因特网的实现。

WSDL:WSDL描述Web服务的公共接口。
这是一个基于XML的关于如何与Web服务通讯和使用的服务描述;
服务 URL 和命名空间
网络服务的类型
(可能还包括 SOAP 的函数调用,正像我所说过的,WSDL 足够自如地去描述网络服务的广泛内容)
有效函数列表
每个函数的参数
每个参数的类型
每个函数的返回值及其数据类型

21. 什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议
是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。
使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议)
可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。
这种相互通信采用的是XML格式的消息。

SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。
在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。

SOAP描述了把消息捆绑为XML的工作方式。
它还说明了发送消息的发送方、消息的内容和地址以及发送消息的时间。
SOAP是Web Service的基本通信协议。
SOAP规范还定义了怎样用XML来描述程序数据(Program Data),怎样执行RPC(Remote Procedure Call)。
大多数SOAP解决方案都支持RPC-style应用程序。
SOAP还支持 Document-style应用程序(SOAP消息只包含XML文本信息)。

最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。
MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。 

SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。
 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。
这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。

SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点。
为此,它提供了一种基于 XML 且具有以下特性的消息处理框架:
1) 可扩展
2) 可通过多种底层网络协议使用
3) 独立于编程模型。

22. 如何部署一个ASP.net页面
VS 2005和VS 2003都有发布机制。
2003可以发布然后再复制部署。
VS2005基本上可以直接部署到对应位置。

23. GC是什么? 为什么要有GC?
答:GC是垃圾收集器。
程序员不用担心内存管理,因为垃圾收集器会自动进行管理。
要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
不过在C#中不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

24. 如何理解.net中的垃圾回收机制
.NET Framework 的垃圾回收器管理应用程序的内存分配和释放。
每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。
只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。
但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。
垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。
当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

25. 列举ASP.NET 页面之间传递值的几种方式。 并说出他们的优缺点。
答. 1).使用QueryString, 如....?id=1; response. Redirect()....
    2).使用Session变量
    3).使用Server.Transfer

session(viewstate)  简单,但易丢失
application   全局
cookie    简单,但可能不支持,可能被伪造
input ttype="hidden"  简单,可能被伪造
url   参数 简单,显示于地址栏,长度有限数据库 稳定,安全,但性能相对弱

26. C#中索引器的实现过程,可以用任何类型进行索引?(比如数字)

27. CTS、CLS、CLR分别作何解释?
CTS:通用语言系统。
CLS:通用语言规范。
CLR:公共语言运行库。

28. .net中读写数据库需要用到那些类?他们的作用?
DataSet: 数据存储器。
DataCommand: 执行语句命令。
DataAdapter: 数据的集合,用语填充。

29 .在.net中,配件的意思是:程序集。(中间语言,源数据,资源,装配清单)

30. 常用的调用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
    2.使用VS.NET中的Add Web Reference菜单选项

31. 微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
.net Remoting 的工作原理是:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。
WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。
remoting是.net中用来跨越machine,process,appdomain进行方法调用的技术
对于三成结构的程序,就可以使用remoting技术来构建.
它是分布应用的基础技术.相当于以前的DCOM
Web Service是一种构建应用程序的普通模型
并能在所有支持internet网通讯的操作系统上实施。
Web Service令基于组件的开发和web的结合达到最佳

32. 启动一个线程是用run()还是start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态。
这意味着它可以由VM调度并执行。
这并不意味着线程就会立即运行。
run()方法可以产生必须退出的标志来停止一个线程。

33. 构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

34. abstract的method不可同时是static,不可同时是native,不可同时是synchronized

35. final, finally, finalize的区别。
final: 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
 因此 一个类不能既被声明为 abstract的,又被声明为final的。
 将变量或方法声明为final,可以保证它们在使用中不被改变。
 被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。
 被声明为 final的方法也同样只能使用,不能重载
finally: 在异常处理时提供 finally 块来执行任何清除操作。
  如果抛出一个异常,那么相匹配的 catch 子句就会执行.
  然后控制就会进入 finally 块(如果有的话)。
finalize: 方法名。
  Java 技术允许使用 finalize() 方法在垃圾收集器将对像从内存中清除出去之前做必要的清理工作。
  这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
  它是在 Object 类中定义的 ,因此所有的类都继承了它。
  子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。
  finalize() 方法是在垃圾收集器删除对像之前对这个对象调用的。

36. 进程和线程的区别:
进程是系统进行资源分配和调度的单位;
线程是CPU调度和分派的单位.
一个进程可以有多个线程,这些线程共享这个进程的资源。

37. 堆和栈的区别:
栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

38. 成员变量和成员函数前加static的作用:
它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。
分别用来反映类的状态。
比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

39. 在c#中using和new这两个关键字有什么意义:
using  引入名称空间或者使用非托管资源
new  新建实例或者隐藏父类方法

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics