页面生命周期 (关于以下生命周期这部分,建议大家上网找找更详细的资料来看)
页面生命周期执行一系列步骤:页面的初始化、实例化控件、还原和维护状态、运行事件处理程序代码、呈现。为了在合适的阶段执行所需的代码,所以要对页面生命周期非常熟悉。在页生命周期的各个阶段,页面会逐个引发定义的事件,通过对代码开发,在页面的生命事件中执行我们所需要的程序

页生命周期阶段
1、页请求:发生在页面生命周期之前,用户请求页时,ASP.NET将确定是否需要分析和编译页,从而确定是否开始页面的生命周期,或者是否可以在不运行页的情况下发送页面缓存以进行响应。

2、开始:设置页属性,如:HttpContext以及其他属性;在此阶段,页面需要确定是回发请求还是新请求,并设置IsPostBack属性;设置页面的UICulture属性。

3、页面初始化:加载所有主题;控件生成,并设置UniqueID;

注:ViewState、ControlState中的值还未加载至控件;如果页面是回发,则回发数据也还未加载;故此时控件可以访问,但值可能出错。

4、加载:如果当前请求是回发请求,则为控件加载ViewState和ControlState中的值。

5、验证:调用所有验证程序控件的Validate方法,此方法将设置验证程序控件和页的IsValid属性。

6、回发事件处理:如果请求是回发请求,则调用所有事件处理程序。

7、呈现:首先对该页和所有控件进行保存视图状态,然后对每个控件调用Render方法,它会提供一个文本编写器,用于将控件的输入写入页的Response属性的OutputStream中。

8、卸载:完成呈现,并已将页发送至客户端、准备丢弃该页后,调用卸载。将卸载属性如:Response和Request等等。

页生命周期事件:
1、PreInit

完成操作:检查IsPostBack属性来确定是不是第一次处理该页;

创建或重新创建动态控件

动态设置主控页

动态设置Theme属性

读取或设置配置文件属性

注:如果请求是回发请求,则控件的值尚未从视图状态恢复,即:不应该在此事件中设置控件属性。

2、Init

完成操作:在所有控件都已经初始化并且应用所有外观设置后引发。使用该事件来读取和初始化控件属性。

3、InitComplete

完成操作:由Page对象引发,使用该事件来处理要求完成所有初始化工作的任务。

4、PreLoad

完成操作:为页和所有控件加载视图状态,然后处理Request 实例包括的任何回发数据。
注:如果需要在Load之前对页或控件进行处理,需要该事件。

5、Load

完成操作:以递归方式加载所有控件。

6、控件事件

完成操作:处理控件引发的事件。

注:在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查Page和各个验证控件的IsValid属性。

7、LoadComplete

8、PreRender

在控件输出前最后的修改机会。

注:在该事件发生前的操作:

Page对所有控件递归进行EnsureChildControl操作

设置了DataSourceID属性的数据绑定控件会调用DataBind方法。

9、SaveStateComplete

在该事件发生前,已经对控件的ViewState进行了保存。将忽略对页和控件所作的所有修改。

10、Render

方法,便于开发

11、UnLoad

大概描述一下ASP.NET服务器控件的生命周期
初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载

应用程序生命周期
在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为Global.asax的文件。如果创建了Global.asax文件,ASP.NET 会将其编译为从HttpApplication类派生的类,然后使用该派生类表示应用程序。

HttpApplication进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。例如,可以在Global.asax文件中定义一个属性,然后为该属性赋一个特定于请求的值。

Application_Start和Application_End方法是不表示HttpApplication事件的特殊方法。在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个HttpApplication实例都调用一次。

asp.net页面在什么时候产生?又在什么时候销毁?
(1)Page_Init();—初始化对象

这一过程主要是初始化包括页面本身的所有控件,每次的页面载入就会执行一次初试过程,而在这里面访问到的也是控件的初始值。还有就是可以通过OnInit()来重载初试化事件

(2) LoadViewState—导入Viewstate数据

在初试化事件后,在loadvireState事件中所有控件将获得他们的第一个属性ViewState属性,这个属性最终将被返回给服务器以判断这个页面是已经被用户访问完毕还是仍然在被

用户所访问。也可重载loadvireState事件对相应的控件进行值设定。

(3) Load Postback data;—用LoadPostData处理Postback数据

Postback数据也可以理解成就是服务器页面提交的表单数据,每一次表单数据的提交都会触发执行IPostBackDataHandler接口操作的控件。

(4) Page_Load();—导入对象

这个过程就比较熟悉了,也是在页面的每次载入时一定会执行,但是注意和PageInit()之间的区别,所有的对象第一次被布置在DOM页面(在Asp.net中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可以很容易的从客户端获得诸如宽度、高度、值、可见性等在Html中的属性值。经常会用到的Page.IsPostBack()指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问.

(5) Handle control events;—具体的控件事件

这个过程执行的是相应具体控件事件,比如按钮事件..等。

(6) Page_PreRender();—预先呈递对象

预先呈递对象可以改变对象并将改变保存的最后时刻.可以对控件的属性、控件树的结构等做出最后的修改,同时还不用考虑Asp.net对其作出任何改变,因为此时已经脱离了数据库调用以及viewstate更新了,也可以通过OnPreRender来重载。

(7) Page_Render();—呈递对象呈递页面

所有对页面控件的修改完成后viewstate就被保存了。运用Html创建给浏览器输出的页面的时候Render事件就发生了。在Render事件过程中,页面调用其中的对象将它们呈递给Html。然后,页面就可以以Html的形式被用户的浏览器访问了。当Render事件被重载时,开发者可以编写自定义的Html代码使得原先生成的Html都无效而按照新的Html来组织页面。

Render方法将一个HtmlTextWriter对象作为参数并用它将Html在浏览器上以网页的形式显示。这时仍然可以做一些修改动作,不过它们只是客户端的一些变化而已了。亦可以重载Render事件。

(8) Unload event;—卸载对象

当想服务器请求一个对象的时候,就会在内存里生成一个继承页面对象,也就是页面的类,它继承自System.Web.UI.Page.当页面对象从内存中卸载时发生,将触发该事件.

(9) Dispose method called

在呈递给Html完成后,所有的对象都应被销毁。在Dispose事件中,你应该销毁所有在建立这个页面时创建的对象。这时,所有的处理已经完毕,所以销毁任何剩下的对象都是不会产生错误的,包括页面对象。你可以重载Dispose事件。

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

Session有什么重大BUG,微软提出了什么方法加以解决?
是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。当然这种种情况是限于MS的IIS的WEB容器,不是每个容器都有这种问题。

如何处理几十万条并发数据?
用存储过程或事务。取得最大标识的时候同时更新。注意主键不是自增量方式这种方法并发的时候是不会有重复主键的,取得最大标识要有一个存储过程来获取.

谈谈final, finally, finalize的区别。
final(.Net中不存在此修饰符)—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载

finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

sleep() 和 wait() 有什么区别?
sleep():为当前线程指定挂起的时间,是使线程停止一段时间,在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)”醒来”的线程具有更高的优先级

wait():释放对象上的锁,并阻塞当前线程,直到它重新获取该锁。线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

数组有没有length()这个方法? String有没有length()这个方法?
数组和string都没有Length()方法,只有Length属性。

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

List, Set, Map是否继承自Collection接口?
List,Set是Map不是

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能。

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。

swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整型,字符或字符串,因此可以作用在byte和long上,也可以作用在string上。

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。

try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。

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

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

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

String s = new String(“xyz”);创建了几个String Object?
对JAVA来说两个对象,一个是”xyx”,一个是指向”xyx”的引用对象s。

对.NET来说该题是错误的,根本就没这样的构造函数

String a=”xyz”;首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成class文件时就把它放到常量池里了。

GC是什么? 为什么要有GC?
GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:

System.gc()

Runtime.getRuntime().gc()

能用foreach遍历访问的对象需要实现_____接口或声明_____方法的类型。
IEnumerable 、 GetEnumerator。

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

什么叫应用程序域
一种边界,它由公共语言运行库围绕同一应用程序范围内创建的对象建立(即,从应用程序入口点开始,沿着对象激活的序列的任何位置)。

应用程序域有助于将在一个应用程序中创建的对象与在其他应用程序中创建的对象隔离,以使运行时行为可以预知。隔离正在运行的应用程序。

在一个单独的进程中可以存在多个应用程序域。应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。

什么是强类型,什么是弱类型?哪种更好些?为什么?
强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等

什么是受管制的代码?什么是强类型和弱类型系统? CTS、CLS和CLR分别作何解释?
(1)受管制的代码:在.NET环境中运行的任何代码都称为受管制的代码(unmanaged code),.NET外部的其他代码也运行在Windows上,这些代码称为未受管制的代码(unmanaged code) 。

(2)强类型和弱类型的区别在与,在编码过程中是否要指定数据类型,作为强类型必须指定数据类型,编译器为其分配相应的存储空间(如 c ,pascal )否则编译出错。而弱类型不一定需要指定数据类型,编译器会用相同的空间去分配各种类型,除非你指定了(如basic)。作为强类型语言,在编译阶段的安全性要高于弱语言型。

强类型系统:RTTI:类型识别系统。

(3)CLR(Common Language Runtime)的全称是公共语言运行库,读者可以把CLR理解为一个包含运行.NET程序的引擎和一堆符合公共语言基础结构的类库的集合。CLR是一个规范的实现,我们开发的几乎所有的.NET程序都基于CLR的类库来实现,并且运行在CLR提供的运行引擎之上。所谓.NET框架,指的就是公共语言运行库。

公共语言基础(CLI)是微软公司向ECMA提交的一份语言和数据格式规范,CLR是目前为止唯一一个公共语言基础的实现版本。

CTS(Common Type System)的全称是通用类型系统。前文已经介绍了公共语言基础(CLI)的概念,微软公司提交的CLI规范,包括了公共类型系统(CTS)、公共中间语言(CIL)、底部文件格式以及元数据格式等。公共类型系统定义了一个能够在CLR上运行的语言规范。尽管有很多语言本身不符合CTS规范,但是通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出能在CLR上运行的程序。

一种语言编写的程序编译能够在CLR上运行,并不代表这种语言本身完全符合CTS的规范。例如C++语言,仍然保持了其不符合CTS规范的部分,并且在编译时把这部分不符合CTS的代码编译成原始代码而非中间代码。  

CLS(Common Language Specification)的全称是通用语言规范,是CTS的一个子集,它定义了希望编写在.NET平台上运行的程序的语言所需符合的最小规范。正因为.NET允许由不同语言编写的程序一起执行,所以才制定出CLS规范,用以避免不同语言特性产生的错误。

.net中哪项技术(CLR、CTS、CLS)实现跨多语言?
CLR

CLR与IL分别是什么含义?
CLR(公共语言运行库):能管理内存,能够轻松地设计其对象可以跨语言互动的组件和应用程序,编译一次,并可以在任何支持运行库的CPU和操作系统上运行,跨语言集成(特别是跨语言继承)

公共语言运行时,类似于Java中的JVM,Java虚拟机;在.Net环境下,各种编程语言使用一种共同的基础资源环境,这就是CLR,CLR将直接与操作系统进行通信,而编程语言如C#.NET将尽量避免直接与操作系统直接通信,加强了程序代码的执行安全性,可以这样看:CLR就是具体的编程语言如:C#.NET与操作系统之间的翻译,同时它为具体的编程语言提供了许多资源。

IL(中间语言):可用于语言互操作性,IL不是字节代码,但很接近字节代码,因此执行应用程序时,IL到机器代码的转换要快很多。独立于CPU的指令集。由CLR转换为特定于CPU的代码。

IL中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码(不管用哪种语言编写)在进行编译时都被编译成IL。在应用程序运行时被即时(Just-In-Time,JIT)编译器处理成为机器码,被解释及执行。

对象能否调用静态方法
对象能调用静态方法。

PID是什么?在做系统的故障排除时如何使用它?
PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.net等ide将故障进程附加到进程中进行调试(debug)

单个TCP/IP端口上能够被多少个进程侦听?
1个

描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
索引器可以使客户程序很方便地访问类中的集合或数组,类似通过索引访问数组,并且索引器向客户程序隐藏了内部的数据结构。

类似于属性,访问类或结构的集合或数组时,可以用索引器实现,索引器用this关键字声明,声明方法如下:

数据类型 this[参数列表]

{

get

{

以参数为索引返回集合或数组数据

}

set

{

分配值到参数索引的元素

}

}

例:自己建立一个数组

using System;

class MyArray

{

private string[] str = new string[5];

//定义索引器,并有可读可写属性,用this声明属性,接收一个整型类型参数

public string this[int i]

{

get

{

return str[i];

}

set

{

str[i] = value;

}

}

//获得数组长度

public int Length

{

get

{

return str.Length;

}

}

}

public class LxIndex

{

static void Main(string[] args)

{

MyArray ma = new MyArray();

//给数组赋值

Console.WriteLine(“给数组赋值,请输入数组元素值:”);

for (int i = 0; i < ma.Length; i++)

{

ma[i] = Console.ReadLine();

}

//输出数组中的元素

Console.WriteLine("你输入的内容是:");

for (int i = 0; i < ma.Length; i++)

{

Console.Write(ma[i] + " ");

}

}

}

结果:

给数组赋值,请输入数组元素值:

78

tom

**

100

23

你输入的内容是:

78 tom ** 100 23 请按任意键继续. . .

不是。索引器可以用任意类型进行索引。

MVC模式
MVC(Model View Controller)模型-视图-控制器

模型负责业务领域的事情,视图负责显示的事情,控制器把数据读取出来填充模型后把模型交给视图去处理。而各种验证应该是在模型里处理了。它强制性的使应用程序的输入、处理和输出分开。MVC最大的好处是将逻辑和页面分离。

Assembly.Load("foo.dll"); 这句话是否正确?
错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll");

DateTime是否可以为null?
不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null

using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的
有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结

三层架构,用.Net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。目的即为了“高内聚,低耦合”的思想。

表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。

业务逻辑层(BLL):业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。

表示层:为了与用户交互例如用户添加表单针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。

三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。

优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。

缺点: 增加成本。

C#函数中无参数修饰符、out修饰符、params修饰符、ref修饰符的区别
无参数修饰符:表示按值传递

out修饰符:表示按引用传递,传递前不需赋初值,但在传入的方法内赋值,否则报错

ref修饰符:表示按引用传递,传递前必须赋初值,否则报错

params修饰符:可将不确定个数的一组相同类型的数据作为参数传递,函数签名中只能有一个params修饰符,并且应为最后一个参数。

ref 与out有什么不同?
方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。将此方法与 out参数相比,后者的参数在传递到 out 参数之前不必显式初始化。属性不是变量,不能作为 ref 参数传递。如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref 和 out 方面不同的重载。

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。属性不是变量,不能作为 out 参数传递。如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref 和 out 方面不同的重载。

extern 是什么意思?
extern 修饰符用于声明由程序集外部实现的成员函数,经常用于系统API函数的调用(通过 DllImport )。注意,和DllImport一起使用时要加上 static 修饰符

也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名)

不能与 abstract 修饰符同时使用

using System.Runtime.InteropServices;

using System;

namespace TestExtern

{

class ClassHello

{

//extern与DllImport一起使用时必须再加上一个static修饰符

[DllImport("User32.dll")]

public static extern int MessageBox(int Handle, string Message, string Caption, int Type);

static void Main()

{

string myString;

Console.Write("请输入提示信息: ");

myString = Console.ReadLine();

MessageBox(0, myString, "我的测试", 0);

}

}

}

结果:

对象构造器
使用对象构造器,可以使初始化对象像初始化数组一样简单,即在构造函数后直接添加多个初始化语句代码,并用逗号分隔,整体用{}括起来,定义形式如下:

类型声明 实例名称 = new 类型名称() {初始化语句1,初始化语句2};

如果相同成员的不同初始化语句,则以最右面的语句为准。初始化的顺序是先执行构造函数的语句,然后执行对象构造器中的语句。如下例:

Snake s = new Snake () {name="眼镜蛇",length=12,weight=20};

C#匿名类型的的实际应用
通过var和对象构造器,声明一个没有名称(其名称是由编译器分配的)的类,同时创建并初始化成员。如:var pc1 = new {cpu="Intel",memory="AMD"};

如果程序仅仅需要临时一组数据,则用匿名类型比较合适,匿名类型编译后,仍然是一个普通的密封类,不可派生其他类,只是名称是由编译器分配的,利用对象构造器初始化的成员,具有只读属性。匿名内部类同样有构造函数用于初始化成员,只是创建时不需要显式调用。如下列:

const和readonly区别
都可以标识一个常量。主要有以下区别:

1、初始化位置不同。const必须在声明的同时赋值;readonly即可以在声明处赋值,也可以在静态构造方法(必须是静态构造方法,普通构造方法不行)里赋值。

2、修饰对象不同。const即可以修饰类的字段,也可以修饰局部变量;readonly只能修饰类的字段

3、const是编译时常量,在编译时确定该值;readonly是运行时常量,在运行时确定该值。

4、const默认是静态的;而readonly如果设置成静态需要显示声明

5、修饰引用类型时不同,const只能修饰string或值为null的其他引用类型;readonly可以是任何类型。

如果类型限制了不能在编译时确定它的值,可以使用static readonly来代替。

请解释virtual的含义?
virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。

调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。不能将 virtual 修饰符与以下修饰符一起使用:static abstract override除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。

在静态属性上使用 virtual 修饰符是错误的。

通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性

sealed、new、virtual、abstract与override关键字的区别
sealed修饰类代表密封类,不能被继承,修饰方法代表密封方法,不能被重写。通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构混乱

new 显式隐藏基类的成员。不用new隐藏基类的成员也可以,但会给出警告。

virtual为了子类来重写的,子类需要override,如果不用会给个警告

abstract可以修饰类,方法,属性,索引器及事件。

override子类重写基类的abstract,virtual成员,。不能重写非虚拟方法或静态方法

new和override相同点和区别
相同点:都可以对基类成员进行隐藏,都可以用base调用基类的成员

不同点:

1、用override重写基类的方法,要求与基类必须有完全相同的访问修饰符、返回值类型和方法名称名称,参数,异常。new不用

2、用override重写基类的方法,要求基类的方法必须为虚拟的,抽象的或重写的(virtual,abstract,override),而new不必要

3、继承后,用一个基类的对象调用基类的virtual方法时,override重写的子类方法会被访问,而new重写的子类方法不会被访问(只访问基类的virtual方法)

4、new作为运算符时,创建对象,调用构造函数。new 用于约束时 用于在泛型声明中,约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。

using System;

public class BaseClass

{

public BaseClass()

{

Console.WriteLine(" 基类构造");

}

//使用virtual才可以在子类中使用override,而new不必要

public virtual void Method()

{

Console.WriteLine(" 基类.Method()");

}

}

public class ClassA : BaseClass

{

public ClassA()

{

Console.WriteLine(" 类A.构造");

}

public override void Method()

{

//base.Method();

Console.WriteLine(" 类A.Method() in override");

}

}

public class ClassB : BaseClass

{

public ClassB()

{

Console.WriteLine(" 类B.构造");

}

public new void Method()

{

//base.Method();

Console.WriteLine(" 类B.Method() in new");

}

}

class Program

{

static void Main(string[] args)

{

BaseClass ba1 = (BaseClass)new ClassA();//类型转换

//用override重写方法,是基类的一个派生,

//所以这里通过基类的虚函数,会访问到派生类的方法。

ba1.Method();

Console.WriteLine(" =================");

BaseClass bb2 = (BaseClass)new ClassB();//类型转换

//用new重写方法,是一个和基类无关的新方法,

//所以这里基类调用的时候,访问基类的方法。

bb2.Method();

Console.WriteLine(" =================");

ClassA a1 = new ClassA();

a1.Method();

Console.WriteLine(" =================");

ClassB b2 = new ClassB();

b2.Method();

Console.WriteLine(" =================");

Console.ReadKey();

}

}

运行结果:

基类构造

类A.构造

类A.Method() in override

=================

基类构造

类B.构造

基类.Method()

=================

基类构造

类A.构造

类A.Method() in override

=================

基类构造

类B.构造

类B.Method() in new

=================

Web.config配置Windows身份认证
您需要创建一个ASP.NET应用程序,公司考虑使用Windows身份认证。所有的用户都存在于AllWin这个域中。您想要使用下列认证规则来配置这个应用程序:1 匿名用户不允许访问这个应用程序。2所有雇员除了Tess和King都允许访问这个应用程序。请问您应该使用哪一个代码段来配置这个应用程序?

 

Global.asax文件中配置自定义的错误
问:您要创建ASP.NET应用程序用于运行AllWin公司内部的Web站点,这个应用程序包含了50个页面。您想要配置这个应用程序以便当发生一个HTTP代码错误时它可以显示一个自定义的错误页面给用户。您想要花最小的代价完成这些目标,您应该怎么做?

答:在这个应用程序的Global.asax文件中创建一个Application_Error过程去处理ASP.NET代码错误。

在DataGrid控件的Footer显示员工合计数
问:您要创建一个显示公司员工列表的应用程序。您使用一个DataGrid控件显示员工的列表。您打算修改这个控件以便在这个Grid的Footer显示员工合计数。请问您应该怎么做?

答:重写OnItemCreated事件,当Grid的Footer行被创建时显示合计数。

如何在这个程序中使用Web Service
问:您为AllWin公司创建了一个ASP.NET应用程序。这个应用程序调用一个Xml Web Service。这个Xml Web Service将返回一个包含了公司雇员列表的DataSet对象。请问您该如何在这个程序中使用这个Xml Web Service?—答:

答:在“Web引用”对话框中输入这个XML Web service的地址。

修改程序
问:您要创建一个ASP.NET应用程序在DataGrid控件中显示一个经过排序的列表。产品数据被存放于一个名为PubBase的Microsoft SQL Server 数据库。每个产品的主键是ProductID,Numeric型并且每个产品有一个字母描述字段,名为ProductName。您使用一个SqlDataAdapter对象和一个SqlCommand对象通过调用一个存储过程从数据库中获取产品数据。您将SqlCommand对象的CommandType属性设置为CommandType.StoredProcedure,并将它的CommandText属性设置为procProductList。您成功的获取了一个DataTable对象,其中是已经按ProductID降序排列的产品列表。您打算显示以相反的字母顺序排列的ProductName,请问该怎么做?

答:将SqlCommand对象的CommandType属性修改为CommandType.Text,将CommandText属性修改为”SELECT * FROM procProductList ORDER BY ProductName DESC”。然后将这个DataTable对象绑定到DataGrid控件。

货币的值如何按各个不同国家的习惯来输出
问:在C#中有一个double型的变量,比如10321.5,比如122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。比如美国用$10,321.50和$122,235,401.22而在英国则为£10 321.50和£122 235 401.22。

using System;

using System.Globalization;

class Program

{

static void Main(string[] args)

{

//CultureInfo 类呈现区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。

System.Globalization.CultureInfo myCultureUS = new System.Globalization.CultureInfo(“en-US”);

CultureInfo myCultureEN = new CultureInfo(“en-GB”);

CultureInfo myCultureCN = new CultureInfo(“zh-CN”);

double x = 10321.5, y = 122235401.21644;

string str = String.Format(myCultureUS, “My amount={0:c}(美国)”, y);

Console.WriteLine(str);

str = String.Format(myCultureEN, “My amount={0:c}(英国)”, y);

Console.WriteLine(str);

str = String.Format(myCultureCN, “My amount={0:c}(中国)”, y);

Console.WriteLine(str);

}

}

结果:

My amount=$122,235,401.22(美国)

My amount=£122,235,401.22(英国)

My amount=¥122,235,401.22(中国)

请按任意键继续. . .

error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

要用新浪网上的天气预报,怎么办?
用webservice,请求国家气象局的接口。用ajax把新浪网上的网页请求过来,然后解析一下。

母板页与内容页中怎么传参(除Session、Cookie、Application、QuerySting、this.Server.Transfer之外)?
获取母版页上文本框的值赋给内容页的文本框

this.TextBox1.Text = (Master.FindControl(“textBox1″) as TextBox).Text;

获取内容页上文本框的值赋给母版页的文本框

TextBox1.Text = (this.ContentPlaceHolder1.FindControl(“textBox1″) as TextBox).Text;

两根分布不均匀的香,全部烧完需1个小时,如何确定一段15分钟的时间?
同时点燃第一根的两端和第二根的一端,第一根烧完是半个小时,这时点燃第二根的另一端并开始计时,全部烧完就是15分钟。

Xml文档定义的形式?它们的本质区别?解析Xml文档的方式?
a: 两种形式 dtd schema;b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的);c:有DOM,SAX,STAX等。

DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问。

SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问。

STAX:Streaming API for XML(流的API的XML) (StAX)。

.在.net(C# or vb.net)中如何取消一个窗体的关闭。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

e.Cancel = true;

}

在.net(C# or vb.net)中,Appplication.Exit 还是 Form.Close有什么不同?
一个是退出整个应用程序,一个是关闭其中一个form。

62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?
62移动成2的6次方

获得枚举中的常数名称和常数值
通过Enum.GetNames(typeof(枚举))获得枚举名称,Enum.GetValues(typeof(枚举))获得枚举常数值

例如:对于这样的一个枚举类型

using System;

using System.Globalization;

class Program

{

enum Color : byte

{

Red, Green, Blue, Orange

}

static void Main(string[] args)

{

string[] sa = Enum.GetNames(typeof(Color)); // Red, Green, Blue, Orange

Console.WriteLine(“枚举中的常数名称:”);

foreach (string s in sa)

Console.Write(s + “\t”);

Console.WriteLine();

byte[] sb = (byte[])Enum.GetValues(typeof(Color)); // 0,1,2,3

Console.WriteLine(“枚举中的常数值:”);

foreach (byte s in sb)

Console.Write(s + “\t”);

Console.WriteLine();

}

}

结果:

枚举中的常数名称:

Red Green Blue Orange

枚举中的常数值:

0 1 2 3

请按任意键继续. . .

Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
不能,可以实现接口

Static Nested Class 和 Inner Class的不同,说得越多越好
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

HashMap和Hashtable的区别。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.

分析以下代码。
public static void test(string ConnectString)

{

System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();

conn.ConnectionString = ConnectString;

try

{

conn.Open();

//……

}

catch (Exception Ex) {

MessageBox.Show(Ex.ToString());

}

finally {

if (!conn.State.Equals(ConnectionState.Closed))conn.Close();

}

}

1)以上代码可以正确使用连接池吗?

如果传入的connectionString是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。

2)以上代码所使用的异常处理方法,是否所有在test方法内的异常都可以被捕捉并显示出来?

只可以捕捉数据库连接中的异常吧. (finally中,catch中,如果有别的可能引发异常的操作,也应该用try,catch。所以理论上并非所有异常都会被捕捉。)

什么是WSE?目前最新的版 本是多少?

WSE (Web Service Extension) 包来提供最新的WEB服务安全保证,目前最新版本2.0。

请谈谈对正则表达式?
能将一些比较复杂的验证逻辑以简单的验证表达式验证.

请解释web.config文件中的重要节点
动态调试编译–,自定义错误信息–,身份验证—,授权–,应用程序级别跟踪记录–
,会话状态设置–,全球化–

请解释ASP.NET中的web页面与其隐藏类之间的关系?
一个ASP.NET页面一般都对应一个隐藏类,一般都在ASP.NET页面的声明中指定了隐藏类例如一个页面Tst1.aspx的页面声明如下:

Codebehind=”Tst1.aspx.cs” 表明经编译此页面时使用哪一个代码文件

Inherits=”T1.Tst1″ 表用运行时使用哪一个隐藏类

当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决
很有可能是在Page_Load中数据处理时没有进行Page的IsPostBack属性判断

请解释什么是上下文对象,在什么情况下要使用上下文对象
上下文对象是指HttpContext类的Current 属性,当我们在一个普通类中要访问内置对象(Response,Request,Session,Server,Appliction等)时就要以使用此对象

某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:
(1)密码单词的最小长度是两个字母,可以相同,也可以不同

(2)K不可能是单词的第一个字母

(3)如果L出现,则出现次数不止一次

(4)M不能使最后一个也不能是倒数第二个字母

(5)K出现,则N就一定出现

(6)O如果是最后一个字母,则L一定出现

问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?答案:B

A) K B)L C) M D) N

问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少?答案:A

A)1个 B)3个 C)6个 D)9个

问题三:下列哪一个是单词密码?答案: C

A) KLLN B) LOML C) MLLO D)NMKO

请解释流与文件有什么不同?
文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。因此,对于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面。相反,流提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介之一。正如除磁盘外存在多种后备存储器一样,除文件流之外也存在多种流。例如,还存在网络流、内存流和磁带流等。

类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗?
问题的翻译,Are the type system represented by XmlSchema and the CLS isomorphic?我觉得问题是这样的,XMLSchema和CLS的类型系统相似吗?

XmlSchema是一个特定的XML文档,必须满足的一套标准。这些标准能够描述不同的数据类型。比如:xs:Boolean

CLS不管值类型还是引用类型都是一套类型系统,比如System.Boolean.

像不像?你说呢?

从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别?
如果方法在编译时就确定就是前期绑定,如果在运行时确定的叫后期绑定。这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生

举个例子,比如spring在运行时才取类和类的对象,就是后期绑定

调用Assembly.Load算静态引用还是动态引用?
个人理解其实应该是一个反射,System.Reflection.Assembly.Load.所以嘛肯定动态引用了。因为静态引用在编译时就已经引用,并使用。

何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile?
(声明以下是抄的,我不太了解Assembly.LoadFrom)。区别如下:

1、Assembly.LoadFile只载入相应的dll文件,不载入相应dll内引用的其他dll,比如Assembly.LoadFile(“a.dll”),则载入a.dll,假如a.dll中引用了b.dll的话,b.dll并不会被载入。

Assembly.LoadFrom则不一样,它会载入相应的dll文件及其引用的其他dll,比如上面的例子,b.dll也会被载入。

2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如a.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom(“2\\a.dll”)载入版本2时,不能载入,而是返回版本1。

Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?
它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。

做强签名的assembly与不做强签名的assembly有什么不同?
强签名的程序集可以确认assembly name是唯一的(因为使用了public key token)。

强签名的程序集可以做成com。

强签名程序集可以安装到GAC中。

DateTime是否可以为null?
不能为null,包括int什么的都不能等于null。当然2.0可以里加可空类型,但是在编译后你会发现可空类型其实是假的。

什么叫JIT?什么是NGEN?它们分别有什么限制和好处?
.NET 采用中间语言(IL)机制。JIT(Just In Time)即时编译是指程序第一次运行的时候才进行把中间语言(IL)编译成机器代码,JIT增加了执行效率。

本机映像生成器 (Ngen.exe) 是一个提高托管应用程序性能的工具。

Ngen.exe 创建本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行库可从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。这是为什么asp.net程序第一次会比较慢,因为他是JIT。

.NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非确定性终结?
垃圾收集器不能管理对象的生命周期吧??我认为他只能跟踪对象的生命周期

先看一个对象的生命周期

1. 调用IL的newobj指令,分配一定空间的内存。

2. 初始化内存空间,比如设置为string类型。

3. 使用对象。

4. 销毁对象,执行清理

5. 回收内存

垃圾收集是在第4步。有三种方法:Finalize、Dispose、Close。

但垃圾收集执行的时机不定的,初学者可以认为对象销毁的时机是在垃圾收集器认为对象需要被销毁的时候进行的,他对于程序员是透明的,初学者根本不需要知道垃圾收集器的存在。

个人理解的垃圾收集器的执行原理周期性地遍历被应用当前引用的所有对象的列表。在这个搜索过程中,凡是没有发现的对象,都将准备予以销毁(但不并不是马上就销毁,只是先标记)。这种算法表示如果对象的最后一个引用也被解除时(意思是该对象再也不使用了,即可以销毁了),这时垃圾收集器并不会立即接到通知,只有下一次对堆(heap)进行清扫时,才能发现这个情况。 说明了对象在什么时候终结是不确定的,我认为这就是非确定性终结。进一步而言,执行垃圾收集清扫次数越少,这类算法工作得越好。通常来说,堆的耗尽是收集清扫的触发条件。

Finalize()和Dispose()之间的区别?
Finalize自动释放资源,Dispose()用于手动释放资源。

一. Finalize

Finalize很像C++的析构函数,我们在代码中的实现形式为这与C++的析构函数在形式上完全一样,但它的调用过程却大不相同。

~ClassName() {//释放你的非托管资源}

比如类A中实现了Finalize函数,在A的一个对象a被创建时(准确的说应该是构造函数被调用之前),它的指针被插入到一个finalization链表中;在GC运行时,它将查找finalization链表中的对象指针,如果此时a已经是垃圾对象的话,它会被移入一个freachable队列中,最后GC会调用一个高优先级线程,这个线程专门负责遍历freachable队列并调用队列中所有对象的Finalize方法,至此,对象a中的非托管资源才得到了释放(当然前提是你正确实现了它的Finalize方法),而a所占用的内存资源则必需等到下一次GC才能得到释放,所以一个实现了Finalize方法的对象必需等两次GC才能被完全释放。

由于Finalize是由GC负责调用,所以可以说是一种自动的释放方式。但是这里面要注意两个问题:第一,由于无法确定GC何时会运作,因此可能很长的一段时间里对象的资源都没有得到释放,这对于一些关键资源而言是非常要命的。第二,由于负责调用Finalize的线程并不保证各个对象的Finalize的调用顺序,这可能会带来微妙的依赖性问题。如果你在对象a的Finalize中引用了对象b,而a和b两者都实现了Finalize,那么如果b的Finalize先被调用的话,随后在调用a的Finalize时就会出现问题,因为它引用了一个已经被释放的资源。因此,在Finalize方法中应该尽量避免引用其他实现了Finalize方法的对象。

可见,这种“自动”释放资源的方法并不能满足我们的需要,因为我们不能显示的调用它(只能由GC调用),而且会产生依赖型问题。我们需要更准确的控制资源的释放。

二. Dispose

Dispose是提供给我们显示调用的方法。由于对Dispose的实现很容易出现问题,所以在一些书籍上(如《Effective C#》和《Applied Microsoft.Net Framework Programming》)给出了一个特定的实现模式:

using System;

using System.Globalization;

class DisposePattern :IDisposable

{

private System.IO.FileStream fs = new System.IO.FileStream(“test.txt”, System.IO.FileMode.Create);

//析构函数

~DisposePattern()

{

Dispose(false);

}

//IDisposable Members

#region IDisposable Members

public void Dispose()

{

//告诉GC不需要再调用Finalize方法,

//因为资源已经被显示清理

GC.SuppressFinalize(this);

Dispose(true);

}

#endregion

protected virtual void Dispose(bool disposing)

{

//由于Dispose方法可能被多线程调用,

//所以加锁以确保线程安全

lock (this)

{

if (disposing)

{

//说明对象的Finalize方法并没有被执行,

//在这里可以安全的引用其他实现了Finalize方法的对象

}

if (fs != null)

{

fs.Dispose();

fs = null; //标识资源已经清理,避免多次释放

}

}

}

}

在注释中已经有了比较清楚的描述,另外还有一点需要说明:如果DisposePattern类是派生自基类B,而B是一个实现了Dispose的类,那么DisposePattern中只需要override基类B的带参的Dispose方法即可,而不需要重写无参的Dispose和Finalize方法,此时Dispose的实现为:

class DerivedClass : DisposePattern

{

protected override void Dispose(bool disposing)

{

lock (this)

{

try

{

//清理自己的非托管资源,

//实现模式与DisposePattern相同

}

finally

{

base.Dispose(disposing);

}

}

}

}

当然,如果DerivedClass本身没有什么资源需要清理,那么就不需要重写Dispose方法了,正如我们平时做的一些对话框,虽然都是继承于System.Windows.Forms.Form,但我们常常不需要去重写基类Form的Dispose方法,因为本身没有什么非托管的咚咚需要释放。

了解GC的脾性在很多时候是非常必要的,起码在出现资源泄漏问题的时候你不至于手足无措。我写过一个生成excel报表的控件,其中对excel对象的释放就让我忙活了一阵。如果你做过excel开发的话,可能也遇到过结束excel进程之类的问题,特别是包装成一个供别人调用的库时,何时释放excel对象以确保进程结束是一个关键问题。当然,GC的内部机制非常复杂,还有许多内容可挖,但了解所有细节的成本太高,只需了解基础,够用就好。

using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。
using()能自动调用Dispose方法

比如:using()会自动调用MyObject的Dispose方法

using ( MyObject myObject = new MyObject ( ) )

{

Console.WriteLine ( “quit” ) ;

}

IDisposiable是显示释放对象的接口,实现IDisposiable接口的类,可以显示的释放对象。通过编写Dispose方法来实现显式释放资源;

// C#

class MyClass : IDisposable

{

// 构造函数

public MyClass() {

}

// 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现),与C++/CLI的!MyClass()等效

~MyClass() {

}

// Dispose方法

public void Dispose() { }

public static void Test()

{

using (MyClass auto = new MyClass())

{

}

// 因为使用了using句法,编译器自动调用auto.Dispose()

// 以上代码等效于:

MyClass user = new MyClass();

try {

}

finally {

user.Dispose();

}

}

}

tasklist /m “mscor*” 这句命令是干嘛的?
列出所有使用了以” mscor”作为开头的dll或者exe的进程和模块信息

in-proc和out-of-proc的区别
in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操作需要用进程间通讯来实现。

.NET里的哪一项技术能够实现out-of-proc通讯?
.Net Remoting技术或者WCF技术

当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?
Xp : aspnet_Wp.exe

Windows 2000 : inetinfo.exe

Windows 2003 : w3wp.exe

在.Net中所有可序列化的类都被标记为什么?
[serializable]

DateTime.Parse(myString); 这行代码有什么问题?
有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()

PDB是什么东西? 在调试中它应该放在哪里?
PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。

什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
不知道,望指教 ?

写一个标准的lock(),在访问变量的前后创建临界区,要有”双重检查”,
lock的使用

public void LockTest()

{

Object lockObj = new Object();

lock (lockObj)

{

//

}

}

什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
FullTrust完全信任。放入GAC中的Assembly是否FullTrust我的理解不是。我理解FullTrust是可以通过代码设定的

代码加上需要安全权限的特性有什么好处?
可以更加灵活的设置对代码的访问权限,实现代码级保护。这点不是特清楚,有明白的给讲解下

gacutil /l | find /i “Corillian” 这句命令的作用是什么?
全局程序集缓存中如果有Corillian就更新该程序集,没有就安装

sn -t foo.dll 这句命令是干嘛的?
显示程序集foo.dll的公钥标记

DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,

有关内容我在http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html 有过一些描述。135是远程过程调用(RPC)的默认端口

对比OOP和SOA,它们的目的分别是什么?
我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而SOA是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。

XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

ACL(access control list) 访问控制表

ACL是存在于计算机中的一张表,它使操作系统明白每个用户对特定系统对象,例如文件目录或单个文件的存取权限。每个对象拥有一个在访问控制表中定义的安全属性。这张表对于每个系统用户有拥有一个访问权限。最一般的访问权限包括读文件(包括所有目录中的文件),写一个或多个文件和执行一个文件(如果它是一个可执行文件或者是程序的时候)。Windows NT,Novell公司的Netware,Digital公司的 OpenVMS和基于UNIX系统是使用这种访问控制表的系统。而此表的实现在各个系统中却不一样。

为什么不提倡catch(Exception)?
原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等

Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

PDB 程序数据库文件,文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。

JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么

a.Equals(b)和a == b一样吗?
不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等

在对象比较中,对象一致和对象相等分别是指什么?
对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同

在.NET中如何实现深拷贝(deep copy)?
实现IClonable接口

请解释一下IClonable
IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。

而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().

深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较
using System;

public class Name

{

public string FirstName;

public string LastName;

}

public class Person : ICloneable

{

public Name PersonName;

public string Email;


/// Deep Copy的例子

///

///

public Object Clone()

{

Person p = new Person();

p.Email = this.Email;

p.PersonName = new Name();

p.PersonName.FirstName = this.PersonName.FirstName;

p.PersonName.LastName = this.PersonName.LastName;

return p;

}

public void ChangLastName(string lastName)

{

this.PersonName.LastName = lastName;

}

public static void Main()

{

Person p = new Person();

p.PersonName = new Name();

p.PersonName.LastName = “jill”;

p.PersonName.FirstName = “zhang”;

p.Email = “jillzhang@126.com”;

Person sameNamePerson = p.Clone() as Person;

sameNamePerson.ChangLastName(“clr_”);

Console.WriteLine(p.PersonName.LastName);

Console.WriteLine(sameNamePerson.PersonName.LastName);

Person samePerson = p.MemberwiseClone() as Person;

samePerson.ChangLastName(“Shadow”);

Console.WriteLine(p.PersonName.LastName);

Console.WriteLine(sameNamePerson.PersonName.LastName);

Console.Read();

}

}

结果:

jill

clr_

Shadow

clr_

string是值类型还是引用类型?
引用类型

XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。

特性能够放到某个方法的参数上?如果可以,这有什么用?
可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便报错。

对方法的参数设置Attribute的例子

[AttributeUsage(AttributeTargets.Parameter)]

public class ParameterAtt : Attribute

{

public int Min = 100;

}

public class AttributeTest

{

public void TestMethod([ParameterAtt(Min = 100)] int par1)

{

ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];

ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt;

if (att.Min > par1)

{

throw new Exception(“要求para1最小为” + att.Min);

}

}

}

用什么方法比较2个字符串相似,且在系统运行时长驻内存?
生成正则表达式进行比较,使用静态变量/方法就可以长驻内存了

Collection和Collections的区别?
Collection是集合类的上级接口,Collections是针对集合类的一个帮助类,它提供一系列静态方法来实现对各种集合的搜索,排序,线程安全化操作。

存在System.Collections 命名空间

死锁的必要条件?怎么克服?
系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。

什么是死锁?死锁(Deadlock):是指两个或两个以上的进程在运行过程中,因争夺资源而造成的一种互相等待(谁也无法再继续推进)的现象,若无外力作用,它们都将无法推进下去。

死锁的四个必要条件

l 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

l 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

l 非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

l 循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

处理死锁的策略

1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

2.检测死锁并且恢复。

3.仔细地对资源进行动态分配,以避免死锁。

4.通过破除死锁四个必要条件之一,来防止死锁产生。

什么是Windows服务,它的生命周期与标准的EXE程序有什么不同
Windows 服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,想比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用。自动方式的时候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户,这在对系统资源访问的时候特别需要注意。

请解释转发与跳转的区别?
转发就是服务端的跳转A页面提交数据到B页面,B页面进行处理然后从服务端跳转到其它页面,跳转就是指客户端的跳转

请简述一下用Socket进行同步通讯编程的详细步骤
1、在应用程序和远程设备中使用协议和网络地址初始化套接字

2、在应用程序中通过指定端口和地址建立监听

3、远程设备发出连接请求

4、应用程序接受连接产生通信scoket

5、应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束)

6、通讯结束,关闭应用程序和远程设备的Socket回收资源

什么叫做SQL注入,如何防止?请举例说明。
利用sql关键字对网站进行***。过滤关键字’等

所谓SQL注入(SQL Injection),就是利用程序员对用户输入数据的合法性检测不严或不检测的特点,故意从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取想得到的资料。

请叙述属性与索引器的区别。
属性 索引器

通过名称标识。 通过签名标识。

通过简单名称或成员访问来访问。 通过元素访问来访问。

可以为静态成员或实例成员。 必须为实例成员。

属性的get访问器没有参数。 索引器的get访问器具有与索引器相同的形参表

属性的set访问器包含隐式value参数。除了value参数外,索引器的 set 访问器还具有与索引器相同的形参表。

String类与StringBuilder类有什么区别?为啥在.Net类库中要同时存在这2个类?
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用 System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和 String类简直不是一个数量级的

选择题
1、您要创建ASP.NET应用程序用于运行AllWin公司内部的Web站点,这个应用程序包含了50个页面。您想要配置这个应用程序以便当发生一个 HTTP代码错误时它可以显示一个自定义的错误页面给用户。您想要花最小的代价完成这些目标,您应该怎么做?(多选)( CD )

  A.在这个应用程序的Global.asax文件中创建一个Application_Error过程去处理ASP.NET代码错误。

  B.在这个应用程序的Web.config文件中创建一个applicationError节去处理ASP.NET代码错误。

  C.在这个应用程序的Global.asax文件中创建一个CustomErrors事件去处理HTTP错误。

  D.在这个应用程序的Web.config文件中创建一个CustomErrors节去处理HTTP错误。

  E.在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET 代码错误。

F. 在这个应用程序的每一页中添加一个Page指示符去处理ASP.NET HTTP错误。

2、您的公司有一个DB Server,名为AllWin,其上装了MS SQLSERVER 2000。现在需要您写一个数据库连接字符串,用以连接AllWin上SQL SERVER中的一个名为PubBase实例的Test库。请问,应该选择下面哪一个字符串?( B )

  A. “Server=AllWin;Data Source=PubBase;Initial Catalog=Test;Integrated Security=SSPI”

  B. “Server= AllWin;Data Source=PubBase;Database=Test;Integrated Security= SSPI”

  C. “Data Source= AllWin \PubBase;Initial Category=PubBase;Integrated Security= SSPI”

  D. “Data Source= AllWin \ PubBase;Database=Test;Integrated Security= SSPI”

3. 您要创建一个ASP.NET应用程序在DataGrid控件中显示一个经过排序的列表。产品数据被存放于一个名为PubBase的Microsoft SQL Server 数据库。每个产品的主键是ProductID,Numeric型并且每个产品有一个字母描述字段,名为ProductName。您使用一个 SqlDataAdapter对象和一个SqlCommand对象通过调用一个存储过程从数据库中获取产品数据。您将SqlCommand对象的 CommandType属性设置为CommandType.StoredProcedure,并将它的CommandText属性设置为 procProductList。您成功的获取了一个DataTable对象,其中是已经按ProductID降序排列的产品列表。您打算显示以相反的字母顺序排列的ProductName,请问该怎么做? ( B )

  A. 将SqlCommand对象的CommandType属性修改为CommandType.Text,将CommandText属性修改为”SELECT * FROM procProductList ORDER BY ProductName DESC”。然后将这个DataTable对象绑定到DataGrid控件。

  B. 创建一个基于这个DataTable对象的新的DataView并将这个DataView的Sort属性设置为“ProductName DESC”。然后将这个DataView对象绑定到DataGrid控件。

  C. 将DataGrid控件的AllowSorting属性设置为True,并将DataGridColumn的SortExpression属性设置为 “ProductName DESC”.以显示ProductName。然后将这个DataTable对象绑定到DataGrid控件。

  D. 将DataTable对象的DisplayExpression属性设置为 “ORDER BY ProductName DESC”.。然后将这个DataTable对象绑定到DataGrid控件。

4、您需要创建一个ASP.NET应用程序,公司考虑使用Windows身份认证。

  所有的用户都存在于AllWin这个域中。您想要使用下列认证规则来配置这个应用程序:

    a、 匿名用户不允许访问这个应用程序。

    b、 所有雇员除了Tess和King都允许访问这个应用程序。

  请问您应该使用以下哪一个代码段来配置这个应用程序?( A )

A.

   

   

   

 

B.

   

   

   

 

C.

   

   

   

 

D.

   

   

 

E.

   

   

 

5.对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC )

A.Close B.DisposeC.Finalize

D.using E.Quit

6.Net依赖以下哪项技术实现跨语言互用性?( C )

A.CLR B.CTS C.CLS D.CTT

7.以下哪个类是int的基类?( )

A.Int32 B.Object C.ValueType D.Int16

8.以下哪些可以作为接口成员? (多选) ( ABDE )

A.方法B.属性C.字段D.事件E.索引器

F.构造函数G.析构函数

9.以下关于ref和out的描述哪些项是正确的?(多选) ( ACD )

A.使用ref参数,传递到ref参数的参数必须最先初始化。

B.使用out参数,传递到out参数的参数必须最先初始化。

C.使用ref参数,必须将参数作为ref参数显式传递到方法。

D.使用out参数,必须将参数作为out参数显式传递到方法。

10.“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述?( B )

A.public B.protected C.internal D.protected internal

11.class Class1

{

private static int count = 0;

static Class1()

{

count++;

}

public Class1()

{

count++;

}

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

请问,o1.Count的值是多少?( C )

A.1 B.2 C.3 D.4

12.

using System;

abstract class BaseClass

{

public virtual string MethodA()

{

return “aaaa”;

}

public virtual string MethodB()

{

return “bbbb”;

}

}

class Class1: BaseClass

{

public string MethodA(string arg)

{

return “cccc”;

}

public override string MethodB()

{

return “dddd”;

}

}

class Class2: Class1

{

new public string MethodB()

{

return “eeee”;

}

}

class MainClass

{

public static void Main(string[] args)

{

Class2 o = new Class2();

Console.WriteLine(o.MethodA());

}

}

结果:

aaaa

请按任意键继续. . .

请问,o.MethodA调用的是: ( A )

A.BaseClass.MethodAB.Class2.MethodA

C.Class1.MethodAD.都不是

13.接口是一种引用类型,在接口中可以声明(A),但不可以声明公有的域或私有的成员变量。

a)方法、属性、索引器和事件; b)方法、属性信息、属性; c)索引器和字段; d)事件和字段;

14.ASP.NET框架中,服务器控件是为配合Web表单工作而专门设计的。服务器控件有两种类型,它们是(A )

a)HTML控件和Web控件 b)HTML控件和XML控件 c)XML控件和Web控件 d)HTML控件和IIS控件

15.ASP.NET中,在Web窗体页上注册一个用户控件,指定该控件的名称为”Mike”,正确的注册指令为( D)

a)

b)

c)

d)以上皆非

16.在ADO.NET中,对于Command对象的ExecuteNonQuery()方法和ExecuteReader()方法,下面叙述错误的是(C)。

a)insert、update、delete等操作的Sql语句主要用ExecuteNonQuery()方法来执行;

b)ExecuteNonQuery()方法返回执行Sql语句所影响的行数。

c)Select操作的Sql语句只能由ExecuteReader()方法来执行;

d)ExecuteReader()方法返回一个DataReder对象;

17.下列ASP.NET语句(b)正确地创建了一个与SQL Server 2000数据库的连接。

a)SqlConnection con1 = new Connection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);

b)SqlConnection con1 = new SqlConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);

c)SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);

d)SqlConnection con1 = new OleDbConnection(“Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB”);

18.Winform中,关于ToolBar控件的属性和事件的描述不正确的是(D)。

a)Buttons属性表示ToolBar控件的所有工具栏按钮

b)ButtonSize属性表示ToolBar控件上的工具栏按钮的大小,如高度和宽度

c)DropDownArrows属性表明工具栏按钮(该按钮有一列值需要以下拉方式显示)旁边是否显示下箭头键

d)ButtonClick事件在用户单击工具栏任何地方时都会触发

19.在ADO.NET中执行一个存储过程时,如果要设置输出参数则必须同时设置参数的方向和(B ),必要时还要设置参数尺寸。

a)大小; b)上限; c)初始值; d)类型;

20.如果将窗体的FormBoderStyle设置为None,则( B)。

a)窗体没有边框并不能调整大小; b)窗体没有边框但能调整大小;

c)窗体有边框但不能调整大小; d)窗体是透明的;

21.如果要将窗体设置为透明的,则( B)

a)要将FormBoderStyle属性设置为None; b)要将Opacity属性设置为小于100%得值;

c)要将locked 属性设置为True; d)要将 Enabled属性设置为True;

22.下列关于C#中索引器理解正确的是(B/C )

a)索引器的参数必须是两个或两个以上 b)索引器的参数类型必须是整数型

c)索引器没有名字 d)以上皆非

23.下面描述错误的是( C/D)。

a)窗体也是控件; b)窗体也是类; c)控件是从窗体继承来的; d)窗体的父类是控件类;

24.要对注册表进行操作则必须包含( D)。

a)System.ComponentModel命名空间; b)System.Collections命名空间;

c)System.Threading命名空间; d)Microsoft.Win32命名空间;

25.要创建多文档应用程序,需要将窗体的(D )属性设为true。

a)DrawGrid; b)ShowInTaskbar; c)Enabled; d)IsMdiContainer;

26.如果设treeView1=new TreeView(),则treeView1.Nodes.Add(“根节点”)返回的是一个 ()类型的值。

a)TreeNode;

b)int;

c)string;

d)TreeView;

27.下面关于XML的描述错误的是(D)。

a)XML提供一种描述结构化数据的方法;

b)XML 是一种简单、与平台无关并被广泛采用的标准;

c)XML文档可承载各种信息;

d)XML只是为了生成结构化文档;

28.装箱、拆箱操作发生在: ( C )

A.类与对象之间 B.对象与对象之间

C.引用类型与值类型之间 D.引用类型与引用类型之间

29.用户类若想支持Foreach语句需要实现的接口是: ( A )

A.IEnumerableB.IEnumerator

C.ICollectionD.ICollectData

30..Net Framework通过什么与COM组件进行交互操作?( C )

A.Side By SideB.Web Service

C.InteropD.PInvoke

31..Net依靠以下哪一项技术解决COM存在的Dll Hell问题的?( A )

A.Side By SideB.Interop

C.PInvokeD.COM+

32.装箱与拆箱操作是否是互逆的操作?( B )

A.是B.否

33.以下哪个是可以变长的数组?( D )

A.Array B.string[]

C.string[N] D.ArrayList

34.用户自定义异常类需要从以下哪个类继承:( A )

A.Exception B.CustomException

C.ApplicationException D.BaseException

35 以下叙述正确的是: B C

A. 接口中可以有虚方法。B. 一个类可以实现多个接口。 C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。

36从数据库读取记录,你可能用到的方法有:B C D

A. ExecuteNonQuery B. ExecuteScalar C. Fill D. ExecuteReader

37.对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) ( ABC )

A.Close B.Dispose C.Finalize

D.using E.Quit

38.以下关于ref和out的描述哪些项是正确的?(多选) ( ACD )

A.使用ref参数,传递到ref参数的参数必须最先初始化。

B.使用out参数,传递到out参数的参数必须最先初始化。

C.使用ref参数,必须将参数作为ref参数显式传递到方法。

D.使用out参数,必须将参数作为out参数显式传递到方法。

39.在对SQL Server 数据库操作时应选用(A)。

a)SQL Server .NET Framework 数据提供程序;

b)OLE DB .NET Framework 数据提供程序;

c)ODBC .NET Framework 数据提供程序;

d)Oracle .NET Framework数据提供程序;

40.下列选项中,(C)是引用类型。

a)enum类型 b)struct类型 c)string类型 d)int类型

41.关于ASP.NET中的代码隐藏文件的描述正确的是(C)

a)Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。编程逻辑唯一与用户界面不同的文件中。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名。

b)项目中所有Web窗体页的代码隐藏文件都被编译成.EXE文件。

c)项目中所有的Web窗体页的代码隐藏文件都被编译成项目动态链接库(.dll)文件。

d)以上都不正确。

42.以下描述错误的是(A)

a)在C++中支持抽象类而在C#中不支持抽象类。

b)C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。

c)在C#中可使用 new 修饰符显式隐藏从基类继承的成员。

d)在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。

43.C#的数据类型有(A)

a)值类型和调用类型; b)值类型和引用类型;c)引用类型和关系类型;d)关系类型和调用类型;

44.下列描述错误的是(D)

a)类不可以多重继承而接口可以;

b)抽象类自身可以定义成员而接口不可以;

c)抽象类和接口都不能被实例化;

d)一个类可以有多个基类和多个基接口;

45.在DOM中,装载一个XML文档的方法(D)

a)save方法 b)load方法 c)loadXML方法 d)send方法

46.下列关于构造函数的描述正确的是(C)

a)构造函数可以声明返回类型。

b)构造函数不可以用private修饰

c)构造函数必须与类名相同

d)构造函数不能带参数

47.以下是一些C#中的枚举型的定义,其中错误的用法有()

a)public enum var1{ Mike = 100, Nike = 102, Jike }

b)public enum var1{ Mike = 100, Nike, Jike }

c)public enum var1{ Mike=-1 , Nike, Jike }

d)public enum var1{ Mike , Nike , Jike }

48.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)。

a)9 b)2 c)6 d)越界

代码书写和阅读
变量A、B如何不通过第三变量来交换(C#实现)?
using System;

class MainClass

{

static void Main(string[] args)

{

int A = 5, B = 7;

Console.WriteLine(“交换前:A=” + A + ” B=” + B);

A = A + B;

B = A – B;

A = A – B;

Console.WriteLine(“交换后:A=” + A + ” B=” + B);

Console.ReadLine();

}

}

结果:

交换前:A=5 B=7

交换后:A=7 B=5

请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
using System.Windows.Forms;

//部分代码略

foreach (Control c in this.Controls)

{

if (c is TextBox)

{

TextBox tb = (TextBox)c;

tb.Text = “aaa”;

}

}

公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView中。

给定以下XML文件,完成算法流程图。

 

 

 

 

 

 

 

 

请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。下面只是个算法思路,不是代码

void FindFile( Directory d )

{

FileOrFolders = d.GetFileOrFolders();

foreach( FileOrFolder fof in FileOrFolders )

{

if( fof is File )

You Found a file;

else if ( fof is Directory )

FindFile( fof );

}

}

根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i)

{

lock (this)

{

if (i > 10)

{

i–;

test(i);

}

}

}

不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)

根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test

{

public delegate void OnDBOperate();

public class UserControlBase : System.Windows.Forms.UserControl

{

public event OnDBOperate OnNew;

private void toolBar_ButtonClick(object sender, System.Windows.Forms.

ToolBarButtonClickEventArgs e)

{

if (e.Button.Equals(BtnNew))

{

//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。

}

}

}

}

答:if( OnNew != null )

OnNew( this, e );

分析以下代码,计算运行结果
string strTmp = “abcdefg某某某”;

int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;

int j= strTmp.Length;

以上代码执行完后i=13,j=10

分析以下代码,计算运行结果
using System;

class A

{

public A()

{

PrintFields();

}

public virtual void PrintFields() { }

}

class B : A

{

int x = 1;

int y;

public B()

{

y = -1;

}

public override void PrintFields()

{

Console.WriteLine(“x={0},y={1}”, x, y);

}

}

当使用new B()创建B的实例时,产生什么输出?

X=1,Y=0,new B()时,首先运行父类的构造方法,构造方法里运行PrintFields()方法,此方法被B类重新,按B类的方法来运行。

求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
using System;

class MainClass

{

static void Main(string[] args)

{

Console.WriteLine(“请输入数字:”);

int Num = int.Parse(Console.ReadLine().ToString());

int Sum = 0;

for (int i = 0; i < Num + 1; i++)

{

if ((i % 2) == 1)

{

Sum += i;

}

else

{

Sum -= i;

}

}

System.Console.WriteLine(Sum.ToString());

System.Console.ReadLine();

}

}

结果:

请输入数字:

5

3

产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
using System;

using System.Collections;

class MainClass

{

static void Main(string[] args)

{

int[] intArr = new int[100];

ArrayList myList = new ArrayList();

Random rd = new Random();

int x = 0;

while (myList.Count < 100)

{

x++;

int num = rd.Next(1, 101);

if (!myList.Contains(num))

{

myList.Add(num);

}

}

for (int i = 0; i < 100; i++)

{

intArr[i] = (int)myList[i];

Console.Write(intArr[i] + " ");

}

Console.WriteLine();

}

}

13 11 2 52 74 7 56 42 69 20 58 84 15 19 87 78 53 36 5 16 34 54 82 22 55 76 61 79

23 8 98 71 44 45 41 26 100 83 86 65 10 1 60 30 81 46 50 43 17 48 62 91 64 35 72

21 6 75 14 9 92 12 96 49 80 33 37 39 93 18 88 63 38 70 28 27 40 95 3 24 97 25 8

5 29 66 68 73 31 59 90 4 57 99 94 89 51 67 77 47 32

请按任意键继续. . .

程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
要求:1.要有联动性,老鼠和主人的行为是被动的。 2.考虑可扩展性,猫的叫声可能引起其他联动效应。

using System;

public sealed class Cat

{

//猫叫时引发的事件

public event EventHandler Calling;

public void Call()

{

Console.WriteLine("猫叫了...");

if (Calling != null) //检查是否有事件注册

Calling(this, EventArgs.Empty); //调用事件注册的方法.

}

}

//老鼠,提供一个方法表示逃跑

public sealed class Mouse

{

public void Escape(object sender, EventArgs e)

{

Console.WriteLine("老鼠逃跑了...");

}

}

//主人,发生猫叫的时候惊醒

public sealed class Master

{

public void Wakened(object sender, EventArgs e)

{

Console.WriteLine("主人惊醒了...");

}

}

//用于测试的执行方法

//程序入口点

public class Program

{

public static void Main(string[] args)

{

//建立猫

Cat cat = new Cat();

//建立老鼠

Mouse mouse = new Mouse();

//建立主人

Master master = new Master();

//注册事件

cat.Calling += new EventHandler(mouse.Escape);

cat.Calling += new EventHandler(master.Wakened);

//猫开始叫

cat.Call();

}

}

结果:

猫叫了...

老鼠逃跑了...

主人惊醒了...

请按任意键继续. . .

以下采用观察者模式

//要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法.2. 对老鼠和主人进行抽象

//评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)

//<2>从Mouse和Master中提取抽象(5分)

//<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒.(3分)

using System;

using System.Collections;

public interface Observer

{

//观察者的响应,如是老鼠见到猫的反映

void Response();

}

public interface Subject

{

//针对哪些观察者,这里指猫的要扑捉的对象—老鼠

void AimAt(Observer obs);

}

public class Mouse : Observer

{

private string name;

public Mouse(string name, Subject subj)

{

this.name = name;

subj.AimAt(this);

}

public void Response()

{

Console.WriteLine(name + ” attempt to escape!”);

}

}

public class Master : Observer

{

public Master(Subject subj)

{

subj.AimAt(this);

}

public void Response()

{

Console.WriteLine(“Host waken!”);

}

}

public class Cat : Subject

{

private ArrayList observers;

public Cat()

{

this.observers = new ArrayList();

}

public void AimAt(Observer obs)

{

this.observers.Add(obs);

}

public void Cry()

{

Console.WriteLine(“Cat cryed!”);

foreach (Observer obs in this.observers)

{

obs.Response();

}

}

}

class MainClass

{

static void Main(string[] args)

{

Cat cat = new Cat();

Mouse mouse1 = new Mouse(“mouse1″, cat);

Mouse mouse2 = new Mouse(“mouse2″, cat);

Master master = new Master(cat);

cat.Cry();

}

}

Cat cryed!

mouse1 attempt to escape!

mouse2 attempt to escape!

Host waken!

请按任意键继续. . .

写出程序的输出结果
using System;

class Program

{

private string str = “Class1.str”;

private int i = 0;

static void StringConvert(string str)

{

str = “A string being converted.”;

}

static void StringConvert(Program c)

{

c.str = “B string being converted.”;

}

static void Add(int i)

{

i++;

}

static void AddWithRef(ref int i)

{

i++;

}

static void Main()

{

int i1 = 10;

int i2 = 20;

string str = “str”;

Program c = new Program();

Add(i1);

AddWithRef(ref i2);

Add(c.i);

StringConvert(str); //string无法被改变

StringConvert(c); //传递对象string可以被改变

Console.WriteLine(i1);

Console.WriteLine(i2);

Console.WriteLine(c.i);

Console.WriteLine(str);

Console.WriteLine(c.str);

}

}

运行结果:

10

21

0

str

B string being converted.

请按任意键继续. . .

写出程序的输出结果
using System;

public abstract class A

{

public A()

{

Console.WriteLine(‘A’);

}

public virtual void Fun()

{

Console.WriteLine(“A.Fun()”);

}

}

public class B : A

{

public B()

{

Console.WriteLine(‘B’);

}

public new void Fun()

{

Console.WriteLine(“B.Fun()”);

}

public static void Main()

{

A a = new B();

a.Fun();

}

}

运行结果:

A

B

A.Fun()

请按任意键继续. . .

有继承关系,在构造子类的时候会先构造父类;Fun函数在子类是被new了一下,只是显示隐藏,并没有重写,所以输出还是A.Fun()。如果子类是被override,则最后输出B.Fun

写出程序的输出结果
using System;

public class A

{

public virtual void Fun1(int i)

{

Console.WriteLine(i);

}

public void Fun2(A a)

{

a.Fun1(1); //以传递进来的对象选择哪个Fun1

Fun1(5); //以调用此方法的对象选择哪个Fun1

}

}

public class B : A

{

public override void Fun1(int i)

{

base.Fun1(i + 1);

}

public static void Main()

{

B b = new B();

A a = new A();

a.Fun2(b);

b.Fun2(a);

}

}

输出结果:

2

5

1

6

请按任意键继续. . .

冒泡排序
using System;

public class MainClass

{

public static void ArraySort()

{

int[] Arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };

int t = 0;

//从小到大排序

for (int i = 0; i < Arr.Length - 1; i++) //总共需要N-1趟

{

for (int j = 0; j < Arr.Length - 1 - i; j++) //每趟总共需要(N-1-趟数)次比较

{

if (Arr[j] > Arr[j + 1])

{

t = Arr[j];

Arr[j] = Arr[j + 1];

Arr[j + 1] = t;

}

}

}

foreach (int i in Arr)

{

Console.Write(i + “,”);

}

}

public static void Main()

{

ArraySort();

}

}

输出:1,2,3,4,5,6,7,8,9,请按任意键继续. . .

写出程序的输出结果
using System;

class A

{

public static int X;

static A()

{

X = B.Y + 1;

}

}

class B

{

public static int Y = A.X + 1;

static B() { }

static void Main()

{

Console.WriteLine(“X={0},Y={1}”, A.X, B.Y);

}

}

输出结果:

X=1,Y=2

请按任意键继续. . .

在.net(C# or vb.net)中如何用户自定义消息,并在窗体中处理这些消息。
在form中重载DefWndProc函数来处理消息:

protected override void DefWndProc(ref System.WinForms.Message m)

{

switch (m.msg)

{

case WM_Lbutton:

///string与MFC中的CString的Format函数的使用方法有所不同

string message = string.Format(“收到消息!参数为:{0},{1}”, m.wParam, m.lParam);

MessageBox.Show(message);///显示一个消息框

break;

case USER:

//处理的代码

default:

base.DefWndProc(ref m);///调用基类函数处理非自定义消息。

break;

}

}

请说明如下代码的结果

using System;

class Father

{

public virtual void show()

{

Console.WriteLine(“Father”);

}

static void Main(string[] args)

{

Father obj = new Child();

obj.show();

}

}

class Child : Father

{

public override void show()

{

Console.WriteLine(“Child”);

}

}

输出:

Child

请按任意键继续. . .

如果把virtual和override去掉,输出结果为Father