资源描述
.net笔试题
姓名: 日期:
1. 填空: (1)面对对象的语言具备____封装____性、_____继承____性、____多态____性。
(2)能用foreach遍历访问的对象需要实现 _______IEnumerable_________接口或申明_______GetEnumerable_________措施的类型。
(3)列举ADO.net中的五个重要对象_______Command________、______Connection_______、_______DataAdapter________、_______DataSet________、_______DataReader__________。
2. 不定项选择:
(1) 如下论述正确的是:bc
A. 接口中能够有虚措施。 B. 一个类能够实现多个接口。
C. 接口不能被实例化。 D. 接口中能够包括已实现的措施。
(2) 从数据库读取统计,你也许用到的措施有:bcd
A. ExecuteNonQuery B. ExecuteScalar
C. Fill D. ExecuteReader
3. 简述 private、 protected、 public、 internal 修饰符的访问权限。
答:public 不受限制的访问
Private 只能在本类中访问
Protected 本类和继承与他的类中的都能访问
Internal 同一个应用程序或类库中
4. 写出一条Sql语句: 取出表A中第31到第40统计(SQLServer, 以自动增加的ID作为主键, 注意:ID也许不是连续的。)
答:select top 10 from a where id not in(select top 30 from a)
或:select top 10 from a where id > (select max(id) from (select top 30 from a) as b)
5 .列举ASP.NET 页面之间传递值的几个方式。
答:
session(viewstate) 简单,但易丢失
application 全局
cookie 简单,但也许不支持,也许被伪造
input type="hidden" 简单,也许被伪造
url参数 简单,显示于地址栏,长度有限
数据库 稳定,安全,但性能相对弱
6. 写出程序的输出成果
class Class1 {
private string str = "Class1.str";
private int i = 0;
static void StringConvert(string str) {
str = "string being converted.";
}
static void StringConvert(Class1 c) {
c.str = "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";
Class1 c = new Class1();
Add(i1);
AddWithRef(ref i2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1);
Console.WriteLine(i2);
Console.WriteLine(c.i);
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
答:10,21,0,str,string being converted.
7.写出程序的输出成果
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()
8. 写出程序的输出成果:
public class A
{
public virtual void Fun1(int i)
{
Console.WriteLine(i);
}
public void Fun2(A a)
{
a.Fun1(1);
Fun1(5);
}
}
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
9. 一列数的规则如下: 1、1、2、3、5、8、13、21、34......
求第30位数是多少, 用递归算法实现。(C#语言)
答:private int Add(int i)
{
if (i <= 0)
{
return 0;
}
else if (i == 1 || i == 2)
{
return 1;
}
else
{
return Add(i - 1) + Add(i - 2);
}
}
10. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
要求: 1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性,猫的叫声也许引起其他联动效应。
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();
}
}
//---------------------------------------------------------------------------------------------
设计措施二: 使用event -- delegate设计..
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler SubEvent;
protected void FireAway()
{
if (this.SubEvent != null)
this.SubEvent();
}
}
public class Cat : Subject
{
public void Cry()
{
Console.WriteLine("cat cryed.");
this.FireAway();
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub) : base(sub)
{
this.name = name;
}
public override void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub){}
public override void Response()
{
Console.WriteLine("host waken");
}
}
class Class1
{
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();
}
}
1. C#中 property 与 attribute的区分,他们各有什么用处,这种机制的好处在哪里?
答:一个是属性,用于存取类的字段,一个是特性,用来标识类,措施等的附加性质
2. 讲一讲你了解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)
答:web服务,是利用SOAP(简单对象访问协议,Simple Object Access Protocol)在HTTP上执行远程措施调用的一个措施,也能够使用WSDL(Web Service Description Language,Web服务描述语言)来完整的描述Web服务,基于XML标准。
3. C#, Java 和 c++的特点,有什么相同的地方,不一样的地方,C#分别从c++和java中吸取了他们那些优点?
答:都是面对对象的语言,C#和java都是建立在虚拟机上的。从java中吸取了跨语言。
4. C#可否对内存进行直接的操作?(这可是个难点哦?要注意!)
答:能够,只要标识为unsafe
5. 用Visual C++ 6.0编写的代码(unmanaged code),怎样在CLR下和其他dot net component结合?
答:被编译成dll
6. 此前作过的某些项目?简介一下自己的编程经验。(这是蒙混不过去的,基本一问就懂得是真是假)
7. 你对企业有什么期望?你的薪水期望值?为何学计算机?此前的工作经验(这非常重要)?
Q3: 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为何
答:使用数据库关系:这么能够尽也许的规范编码、对比较大型的开发来说也轻易维护数据的一致性和完整性,也让数据库的性能尽也许的发挥出来。
实在是不能使用数据库的关系的时候才使用触发器,这让数据逻辑简单,但这时候要注意统计文档,否则,触发器多了,维护难度会相称大。
最后是自己编写逻辑:这么会导致数据的一致性,完整性的维护逻辑相称大,也十分分散,没有良好的文档统计习惯的话,一旦任务出现交接,其他人极难继续你未完成的工作,甚至于过一段时间以后,自己要完全理请逻辑都是一个麻烦的事!因为这些逻辑相称于隐藏起来了的。
Q4:ADO。NET相对于ADO等重要有什么改进?
答:ADO以Recordset存储,而ADO.NET则以DataSet表示。Recordset看起来更像单表,假如让Recordset以多表的方式表示就必须在SQL中进行多表连接。反之,DataSet能够是多个表的集合。ADO 的运作是一个在线方式,这意味着无论是浏览或更新数据都必须是实时的。ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本,ADO.NET的数据库连接也只有在这段时间需要在线。因为ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范,而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提升了整体性能。
Q5:ASP。NET与ASP相比,重要有哪些进步?
答:ASP.Net挣脱了此前ASP使用脚本语言来编程的缺陷,理论上能够使用任何编程语言包括C++ , VB , JS等等,当然,最适宜的编程语言还是MS为.Net Frmaework专门推出的C(读c sharp),它能够看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是以为它和Java更象某些吧。首先它是面对对象的编程语言,而不是一个脚本,因此它具备面对对象编程语言的一切特性,例如封装性、继承性、多态性等等,这就处理了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清楚,易于管理,并且应用到ASP.Net上就能够使业务逻辑和Html页面分离,这么无论页面原型怎样变化,业务逻辑代码都无须做任何改动;继承性和多态性使得代码的可重用性大大提升,你能够通过继承已经有的对象最大程度保护你此前的投资。并且C#和C++、Java同样提供了完善的调试/纠错体系。
Q6:C#中的委托是什么?事件是不是一个委托?
答:委托是一个安全的函数指针,事件是一个消息机制
Q7:描述一下C#中索引器的实现过程,是否只能依照数字进行索引?
Q8:C#中要使一个类支持FOREACH遍历,实现过程怎样?
答:实现接口IEnumerable
Q10:写一个HTML页面,实现如下功效,左键点击页面时显示“您好”,右键点击时显示“严禁右键”。并在2分钟后自动关闭页面。
Q11:你对XMLHTTP、WEBSERVICE 了解吗?简单描述其特点、作用
答:XMLHTTP能够积极获取远端web代码,类似HttpWebRequest
Q12:接口和抽象类有什么区分?你选择使用接口和抽象类的依据是什么?
答:接口用于规范,抽象类用于共性。接口中只能申明措施,属性,事件,索引器。而抽象类中能够有措施的实现,也能够定义非静态的类变量。抽象类是类,因此只能被单继承,不过接口却能够一次实现多个。抽象类能够提供某些措施的部分实现,接口不能够.抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。再抽象类中加入一个措施,那么它的子类就同时有了这个措施。而在接口中加入新的措施,那么实现它的类就要重新编写(这就是为何说接口是一个类的规范了)。接口组员被定义为公共的,但抽象类的组员也能够是私有的、受保护的、内部的或受保护的内部组员(其中受保护的内部组员只能在应用程序的代码或派生类中访问)。另外接口不能包括字段、结构函数、析构函数、静态组员或常量。
Q13:自定义控件和一般用户控件的异同?假如要用这二者之一,你会选择哪种?为何
答:用户控件(UserControl): 扩展名为*.ascx,跟*.aspx在结构上相同,是指页面中
加载的功效块,只是用户控件不能单独作为页面运行,必须嵌入到*.aspx页面或其他用
户控件中使用 。
自定义控件,跟HtmlControl或WebControl相同,编译后能够添加引用到工具栏里
面,直接用鼠标拖动使用。
看情况使用,假如功效比较多,会用自定义控件。
Q14:大约描述一下ASP。NET服务器控件的生命周期
答:(1)初始化----在此阶段中,重要完成两项工作:一、初始化在传入Web祈求生命周期内所需的设置;二、跟踪视图状态。首先,页面框架通过默认方式引起Init事件,并调用OnInit()措施,控件开发人员能够重写该措施为控件提供初始化逻辑。此后,页面框架将调用TrackViewState措施来跟踪视图状态。需要注意的是:多数情况下,Control基类提供的TrackViewState措施实现已经足够了。只有在控件定义了复杂属性时,开发人员才也许需要重写TrackViewState措施。
(2)加载视图状态----此阶段的重要任务是检查服务器控件是否存在以及是否需要将其状态恢复到它在处理之前的祈求结束的状态。因此该过程发生在页面回传过程中,而不是初始化祈求过程。在此阶段,页面框架将自动恢复ViewState字典。假如服务器控件不维持其状态,或者它有能力通过默认方式保存其所有状态而使用ViewState字典,那么开发人员则无须实现任何逻辑。针对那些无法在ViewState字典中存储的数据类型或者需要自定义状态管理的情况,开发人员能够通过重写LoadViewState措施来自定义状态的恢复和管理。
(3)处理回发数据----若要使控件能够检查客户端发回的窗体数据,那么必须实现System.Web.UI.IPostBackDataHandler接口的 LoadPostData()措施。因此只有处理回发数据的控件参加此阶段。
(4)加载----至此阶段开始,控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反应了客户端的数据。此时,开发人员能够通过重写OnLoad()措施来实现每个祈求共同的逻辑。
(5)发送回发更改通知----在此阶段,服务器控件通过引起事件作为一个信号,表白因为回发而发生的控件状态变化(因此该阶段仅用于回发过程)。为了建立这种信号,开发人员必须再次使用System.Web.UI.IPostBackDataHandler接口,并实现另一措施-RaisePostBackChangedEvent()。其判断过程为:假如控件状态因回发而更改,则LoadPostData()返回true;否则返回false。页面框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent()。
(6)处理回发事件----该阶段处理引起回发的客户端事件。为了便于将客户端事件映射到服务器端事件上进行处理,开发人员在此阶段能够通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()措施来实现该逻辑。由此途径,服务器控件将成功捕捉回发的客户端事件进行服务器端的对应处理。
(7)预展现----该阶段完成在生成控件之前所需要的任何工作。一般情况下是通过重写OnPreRender()措施完成该工作。需要注意的是:在该阶段,能够保存在预展现阶段对控件状态所做的更改,而在展现阶段进行的更改则会丢失。
(8)保存状态----假如服务器控件不维持状态,或者它有能力通过默认方式保存其所有状态而使用ViewState字典,那么开发人员无须在该阶段实现任何逻辑。因为这个保存状态的过程是自动的。假如服务器控件需要自定义状态保存,或者控件无法在ViewState字典中存储特殊的数据类型,则需要通过重写SaveViewState()措施来实现实状况态保存。
(9)展现----表示向HTTP输出流中写入标识文本的过程。开发人员通过重写Render()措施使其在输出流上自定义标识文本。
(10)处置----在此阶段中,通过重写Dispose ()措施完成释放对昂贵资源的引用,如数据库链接等。
(11)卸载----完成的工作与"处置"阶段相同,不过,开发人员一般在Dispose()措施中执行清除,而不处理Unload事件。
Q15:UML
答:统一建模语言。
Q16:面对对象的概念,重要特点
答:封装,继承,多态
Q17:类划分的依据。类粒度问题
Q18:事物管理问题
第一, 谈谈final, finally, finalize的区分。
答:final 用于申明属性,措施和类,分别表示属性不可变,措施不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个措施,在垃圾搜集器执行的时候会调用被回收对象的此措施,能够覆盖此措施提供垃圾搜集时的其他资源回收,例如关闭文献等。
第二,Anonymous Inner Class (匿名内部类) 是否能够extends(继承)其他类,是否能够implements(实现)interface(接口)?
第三,Static Nested Class 和 Inner Class的不一样,说得越多越好(面试题有的很笼统)。
答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不
同就在于是否有指向外部的引用上
第四,&和&&的区分。
答:&是位运算符,表示与;&&是逻辑运算符,表示”and”
第五,HashMap和Hashtable的区分。
答:Hashtable和HashMap类有三个重要的不一样之处。第一个不一样重要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
也许最重要的不一样是Hashtable的措施是同时的,而HashMap的措施不是。这就意味着,虽然你能够不用采取任何特殊的行为就能够在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同时。一个以便的措施就是利用Collections类的静态的synchronizedMap()措施,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的措施能够让你同时访问潜在的HashMap。这么做的成果就是当你不需要同时时,你不能切断Hashtable中的同时(例如在一个单线程的应用程序中),并且同时增加了诸多处理费用。
第三点不一样是,只有HashMap能够让你将空值作为一个表的条目标key或value。HashMap中只有一条统计能够是一个空的key,但任意数量的条目能够是空的value。这就是说,假如在表中没有发觉搜索键,或者假如发觉了搜索键,但它是一个空的值,那么get()将返回null。假如有必要,用containKey()措施来区分这两种情况。
某些资料提议,当需要同时时,用Hashtable,反之用HashMap。不过,因为在需要时,HashMap能够被同时,HashMap的功效比Hashtable的功效更多,并且它不是基于一个陈旧的类的,因此有人以为,在各种情况下,HashMap都优先于Hashtable。
有关Properties
有时侯,你也许想用一个hashtable来映射key的字符串到value的字符串。DOS、Windows和Unix中的环境字符串就有某些例子,如key的字符串PATH被映射到value的字符串C:\WINDOWS;C:\WINDOWS\SYSTEM。Hashtables是表示这些的一个简单的措施,但Java提供了另外一个措施。
Java.util.Properties类是Hashtable的一个子类,设计用于String keys和values。Properties对象的使用方法同Hashtable的使用方法相象,不过类增加了两个节约时间的措施,你应当懂得。
Store()措施把一个Properties对象的内容以一个可读的形式保存到一个文献中。Load()措施恰好相反,用来读取文献,并设定Properties对象来包括keys和values。
注意,因为Properties扩展了Hashtable,你能够用超类的put()措施来添加不是String对象的keys和values。这是不可取的。另外,假如你将store()用于一个不包括String对象的Properties对象,store()将失败。作为put()和get()的替代,你应当用setProperty()和getProperty(),它们用String参数。
第六,Collection 和 Collections的区分。
答:Collection是集合类的上级接口,继承与他的接口重要有Set 和List.
Collections是针对集合类的一个协助类,他提供一系列静态措施实现对各种集合的搜索、排序、线程安全化等操作
第七,什么时候用assert。
答:断言是一个包括布尔体现式的语句,在执行这个语句时假定该体现式为 true。假如体现式计算为 false,那么系统会报告一个 Assertionerror。它用于调试目标:
assert(a > 0); // throws an Assertionerror if a <= 0
断言能够有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应当总是产生一个布尔值。
Expression2 能够是得出一个值的任意体现式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标识:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标识。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标识。
要系统类中启用断言,可使用 -esa 或者 -dsa 标识。还能够在包的基础上启用或者禁用断言。
能够在预计正常情况下不会抵达的任何位置上放置断言。断言能够用于验证传递给私有措施的参数。不过,断言不应当用于验证传递给公有措施的参数,因为无论是否启用了断言,公有措施都必须检查其参数。不过,既能够在公有措施中,也能够在非公有措施中利用断言测试后置条件。另外,断言不应当以任何方式变化程序的状态。
第八,GC是什么? 为何要有GC?
答:垃圾回收器。释放被视为垃圾的内存
第九,String s = new String("xyz");创建了几个String Object?
答:创建了一个对象,一个引用.对象new String("xyz")呆在堆里,那个引用s在栈中
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
答:12.0;-12;
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答:s1+1是int型,因此改成s1 = (short)(s1+1);背面的没错。
第十二,sleep() 和 wait() 有什么区分?
答:sleep()措施是使线程停止一段时间的措施。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其他线程也许正在运行并且没有被调度为放弃执行,除非(a)"醒来"的线程具备更高的优先级 (b)正在运行的线程因为其他原因而阻塞。wait()是线程交互时,假如线程对一个同时对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等候状态,直到被唤醒或等候时间到。
第十三,Java有无goto?
答:没有
第十四,数组有无length()这个措施? String有无length()这个措施?
答:数组有length属性,没有length()措施
1 String有length()措施,没有length属性
第十五,Overload和Override的区分。Overloaded的措施是否能够变化返回值的类型?
答:重载和覆盖。覆写(Override)的两个函数的函数特性相同,重载(Overload)的两个函数的函数名虽然相同,但函数特性不一样。 函数特性包括函数名,参数的类型和个数。Override 是在继承的时候,假如你写的函数与要继承的函数函数特性相同,那么,加上这个核心字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。
第十六,Set
展开阅读全文