c#面试问题及答案
c#面试问题及答案(一)
以下哪些可以作为接口成员?(多选) ( abde )
a.方法b.属性c.字段d.事件e.索引器
f.构造函数g.析构函数
.以下关于ref和out的描述哪些项是正确的?(多选) (acd)
a.使用ref参数,传递到ref参数的参数必须最先初始化。
b.使用out参数,传递到out参数的参数必须最先初始化。
c.使用ref参数,必须将参数作为ref参数显式传递到方法。
d.使用out参数,必须将参数作为out参数显式传递到方法。
.“访问范围限定于此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述?(b)
a.public b.protected c.internal d.protected internal
16.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
.abstract class baseclass
{
public virtual void methoda()
{
}
public virtual void methodb()
{
}
}
class class1: baseclass
{
public void methoda(string arg)
{
}
public override void methodb()
{
}
}
class class2: class1
{
new public void methodb()
{
}
}
class mainclass
{
public static void main(string[] args)
{
class2 o = new class2();
console.writeline(o.methoda());
}
}
请问,o.methoda调用的是: ( a )
a.baseclass.methodab.class2.methoda
c.class1.methodad.都不是
.请叙述属性与索引器的区别。
属性 索引器
通过名称标识。 通过签名标识。
通过简单名称或成员访问来访问。 通过元素访问来访问。
可以为静态成员或实例成员。 必须为实例成员。
属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表。
属性的 set 访问器包含隐式 value 参数。 除了 value 参数外,索引器的 set 访问器还具有与索引器相同的形参表。
请叙述const与readonly的区别。
每一个class至多只可以定义一个static构造函数,并且不允许增加访问级别关键字,参数列必须为空。
为了不违背编码规则,通常把static数据成员声明为private,然后通过statci property提供读写访问。
const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。
const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全评估。
const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。
readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作推迟到运行期进行。
readonly 关键字与 const 关键字不同: const 字段只能在该字段的声明中初始化。readonly
字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly
字段可用于运行时常数。
readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。
您需要创建一个Asp.net应用程序,公司考虑使用windows身份认证。
所有的用户都存在于allwin这个域中。您想要使用下列认证规则来配置这个应用程序:
a、匿名用户不允许访问这个应用程序。
b、所有雇员除了tess和king都允许访问这个应用程序。
请问您应该使用以下哪一个代码段来配置这个应用程序?( a )
a. 〈authorization〉
〈deny users=”allwin\tess, allwin\king”〉
〈allow users=”*”〉
〈deny users=”?”〉
〈/authorization〉
b. 〈authorization〉
〈allow users=”*”〉
〈deny users=”allwin\tess, allwin\king”〉
〈deny users=”?”〉
〈/authorization〉
c. 〈authorization〉
〈deny users=”allwin\tess, allwin\king”〉
〈deny users=”?”〉
〈allow users=”*”〉
〈/authorization〉
d. 〈authorization〉
〈allow users=”allwin\tess, allwin\king”〉
〈allow users=”*”〉
〈/authorization〉
e.〈authorization〉
〈allow users=”*”〉
〈deny users=”allwin\tess, allwin\king”〉
〈/authorization〉
您要创建一个显示公司员工列表的应用程序。您使用一个datagrid控件显示员工的列表。您打算修改这个控件以便在这个grid的footer显示员工合计数。请问您应该怎么做?(
c? )
a.重写onprerender事件,当grid的footer行被创建时显示合计数。
b.重写onitemcreated事件,当grid的footer行被创建时显示合计数。
c.重写onitemdatabound事件,当grid的footer行被创建时显示合计数。
d. 重写onlayout事件,当grid的footer行被创建时显示合计数。
.您要创建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错误。
您的公司有一个db server,名为allwin,其上装了ms sqlserver
。现在需要您写一个数据库连接字符串,用以连接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”
您为allwin公司创建了一个Asp.net应用程序。这个应用程序调用一个 xml web service。这个 xml web service
将返回一个包含了公司雇员列表的dataset对象。请问您该如何在这个程序中使用这个 xml web service?( ? )
a.在“引用”对话框的.net标签中选择 system.web.services.dll。
b.在“web引用”对话框中输入这个 xml web service 的地址。
c.在您的 global.asax.cs 中添加一条 using 语句并指定这个 xml web service 的地址。
d.在您的 global.asax.cs 中写一个事件处理器导入这个 xml web service 相应的 .wsdl 和 .disco
文件。
.您要创建一个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控件。
.c#代码实现,确保windows程序只有一个实例(instance)
///〈summary〉
///应用程序的主入口点。
///〈/summary〉
[stathread]
staticvoid main()
{
//防止程序多次运行
if(!oneinstance.isfirst(“getpayinfo“))
{
messagebox.show (“警告:程序正在运行中!
请不要重复打开程序!可在右下角系统栏找到!“,“程序错误提示:“,messageboxbuttons.ok,messageboxicon.stop);
return;
}
application.run(new form1());
}
// 防止程序多次执行
publicabstractclass oneinstance
{
///〈summary〉
///判断程序是否正在运行
///〈/summary〉
///〈param name=“appid“〉程序名称〈/param〉
///〈returns〉如果程序是第一次运行返回true,否则返回false〈/returns〉
publicstaticbool isfirst(string appid)
{
bool ret=false;
if(openmutex(0x1f0001,0,appid)==intptr.zero)
{
createmutex(intptr.zero,0,appid);
ret=true;
}
return ret;
}
[dllimport(“kernel32.dll“,charset=charset.auto)]
privatestaticextern intptr openmutex(
uint dwdesiredaccess, // access
int binherithandle, // inheritance option
string lpname // object name
);
[dllimport(“kernel32.dll“,charset=charset.auto)]
privatestaticextern intptr createmutex(
intptr lpmutexattributes, // sd
int binitialowner, // initial owner
string lpname // object name
);
}
简述 private、protected、public、internal 修饰符的访问权限。
private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public :
公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。
写出一条sql语句: 取出表a中第31到第40记录(sqlserver, 以自动增长的id作为主键, 注意:id可能不是连续的。)
select top 10 * from a where id not in (select top 30 id from a)
解2: select top 10 * from a where id 〉 (select max(id) from (select top 30
id from a )as a)
c#面试问题及答案(二)
1, 请你说说.net中类和结构的区别?
答:结构和类具有大体的语法,但是结构受到的限制比类要多。结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数。结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是应用类型,改变其变量的值会改变其原值。申明结构用struck关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用。与类不同,结构的实例化可以不使用new关键字。类可以实现接口。
2, 死锁的必要条件?怎么克服?
答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
3, 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
答:接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。
4, 构造器constructor是否可以被继承?是否可以被override?
答:constructor不可以被继承,因此不能被重写(overriding),但可以被重载(overloading).
5, 当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法?
答:不可以,一个对象的方法只能由一个线程访问。
6, 用最有效的方法算出等已8对于几?
答:2<<3.
7, c#是否可以对内存直接进行操作?
答:这个问题比较难回答,也是个很大的问题。但是可以这样问答。c#是可以对内存进行直接操作的,虽然很少用到指针,但是c#是可以使用指针的,在用的时候需要在前边加unsafe,,在.net中使用了垃圾回收机制(gc)功能,它替代了程序员,不过在c#中不可以直接使用finalize方法,而是在析构函数中调用基类的finalize()方法。
8, error和exception有是区别?
答:error表示恢复不是不可能,但是很困难,exception表示一种实际或实现问题,它表示程序运行正常不可以发生的。
9, 谈谈final,finally,finallize的区别?
答:final用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承。
finally是异常处理语句结构中,表示总是执行的部分。
finallize表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。
10, hashmap和hashtable区别?
答:hashmap是hashtable的轻量级实现,非线程安全的实现他们都实现了map接口,主要区别是hashmap键值可以为空null,效率可以高于hashtable。
11,collection和collections的区别?
答:collection是集合类的上级接口,collections是针对集合类的一个帮助类,它提供一系列静态方法来实现对各种集合的搜索,排序,线程安全化操作。
12,c#中委托是什么?事件是不是一种委托?
答:委托是一种安全的类似与函数指针,但是她比指针要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。事件是一种消息机制,它是一种委托,委托不带方法体。
13,override, overload,的区别?
答:override是重写的意思,它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同。
overload是重载是意思,它也表示重写基类的方法,但是只要方法名相同,别的可以不同。
14,在一个bs结构中需要传递变量值时,不能使用session,coolke,application,你有几中方法?
答:this.server.transfer,querystring.
15, c#种索引器实现过程,是否只能根据数字索引?
答:不是的,可以是任意类型。
16,new有种用法?
答:有3种,第一种是,实例化如:new class()
第二种是,public new 隐藏基类的方法
第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。
17,任何把一个array复制到arraylist中?
答:foreach (object o in array), arraylist.add (0)
等有好多中种方法。自己想。
18,概述反射和序列化?
答:反射:要给发射下一个定义还是比较难的,这里先说说我的理解。反射提供了封装程序集,模块和类型对象,可以用反射动态地创建类型的实例,将类型绑定到现有对象,或者从现有对象类型里获取类型,然后调用类型的方法或访问字段和属性。
序列化:将对象转换为另一种媒介传输的格式过程。如,序列化一个对象,用http通过internet在客户端和服务器之间传递该对象,在另一端用反序列化从该流中重新得到对象。
19,const和readonly?
答:const用来申明编程时申明常量,readonly用来申明运行时常量。
20,udp和tcp连接有和异同?
答:tcp是传输控制协议,提供的是面向连接的,是可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行tcp连接之后才能传输数据。tcp提供超时重拨,检验数据功能。udp是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。
21,进程和线程分别该怎么理解?
答:进程是比线程大的程序运行单元,都是由操作系统所体会的系统运行单元,一个程序中至少要有一个进程,有一个进程中,至少要有一个线程,线程的划分尺度要比进程要小,进程拥有独立的内存单元,线程是共享内存,从而极大的提高了程序的运行效率同一个进程中的多个线程可以并发执行。
22,Asp.net页面之间传递值的几种方式?
答:querystring,session,cookies,application,server.transfer,respose.redictor.
23. 什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?cts、cls和clr分别作何解释?
答:应用程序域:就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。
托管代码:使用clr编译语言编辑器开发编写的代码就叫托管代码。
装箱和拆箱:是把值类型转换为引用类型的过程,是隐式的,相反的过程就是拆箱,是显式的。
cts是公共类型系统,cls是公共语言规范,clr公共语言运行库。
强类型系统:每个变量和对象都必须具有申明类型。
24. 值类型和引用类型的区别?
答:值类型的值是存放在堆栈中的,改变其值,不改变变量原有的值,而引用类型的值是存放在栈中的,其引用的地址是存放在堆栈中的,改变其值也就改变了变量原有的值。值类型不允许包含null值,然而可空类型可以将null赋值给值类型l。
25. Asp.net的身份验证方式有哪些?
答:windows,forms,passport
26. 解释一下uddi、wsdl的意义及其作用?
答:uddi是统一描述集成协议,是一套基于web的,分布式的,为web服务提供的信息注册的实现标准规范,同时为也是为企业本身提供的web服务注册以让别的企业能够发现并访问的协议标准。提供了基于标准的规范,用于描述和发现服务,还提供了一组基于因特网的实现。
wsdl这是一个基于xml的描述web服务的接口。
27. 什么是soap?
答:是简单访问协议。是在分布式环境中,交换信息并实现远程调用的协议。是一个基于xml的协议。使用soap,可以不考虑任何传输协议,但通常还是http协议,可以允许任何类型的对象或代码,在任何平台上,以任一种语言相互通信。它是一种轻量级协议。
28. 如何部署一个Asp.net页面?
答:vs,vsXX里边都有发表机制,vs可以发布然后在复制部署。
vs可以直接部署到对应的位置。
29. 如何理解.net中的垃圾回收机制?
答:.net中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。
30. 面向对象的三大基本原则?
答:封装,继承,多态。