publicstaticStringstaticStr="Class";
publicStringnotstaticStr="Obj";
}
staticvoidMain(string[]args)
//静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
Console.WriteLine("Class1'sstaticStr:{0}",Class1.staticStr);
Class1tmpObj1=newClass1();
tmpObj1.notstaticStr="tmpObj1";
Class1tmpObj2=newClass1();
tmpObj2.notstaticStr="tmpObj2";
//非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
Console.WriteLine("tmpObj1'snotstaticStr:{0}",tmpObj1.notstaticStr);
Console.WriteLine("tmpObj2'snotstaticStr:{0}",tmpObj2.notstaticStr);
Console.ReadLine();
结果:Class1'sstaticStr:ClasstmpObj1'snotstaticStr:tmpObj1tmpObj2'snotstaticStr:tmpObj2
2.const和staticreadonly区别?
答:const
staticreadonly
示例:
测试类:
namespaceExample02Lib
publicclassClass1
publicconstStringstrConst="Const";
publicstaticreadonlyStringstrStaticReadonly="StaticReadonly";
//publicconstStringstrConst="ConstChanged";
//publicstaticreadonlyStringstrStaticReadonly="StaticReadonly
Changed";
客户端代码:
usingExample02Lib;
namespaceExample02
//修改Example02中Class1的strConst初始值后,只编译Example02Lib项目
//然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,
执行Example02.exe
//切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!
//可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变
//表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的
Console.WriteLine("strConst:{0}",Class1.strConst);
Console.WriteLine("strStaticReadonly:{0}",Class1.strStaticReadonly);
结果:strConst:ConststrStaticReadonly:StaticReadonly
修改后的示例:
//publicconstStringstrConst="Const";
//publicstaticreadonlyStringstrStaticReadonly="StaticReadonly";
publicconstStringstrConst="ConstChanged";
publicstaticreadonlyStringstrStaticReadonly="StaticReadonlyChanged";
结果
strConst:ConststrStaticReadonly:StaticReadonlyChanged
usingSystem.Runtime.InteropServices;
namespaceExample03
//注意DllImport是一个AttributeProperty,在System.Runtime.InteropServices命名空间中定义
//extern与DllImport一起使用时必须再加上一个static修饰符
[DllImport("User32.dll")]
publicstaticexternintMessageBox(intHandle,stringMessage,
stringCaption,intType);
staticintMain()
stringmyString;
Console.Write("Enteryourmessage:");
myString=Console.ReadLine();
returnMessageBox(0,myString,"MyMessageBox",0);
4.abstract是什么意思?
namespaceExample04
#region基类,抽象类
publicabstractclassBaseClass
//抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写
publicabstractStringAttribute
get;
set;
//抽象方法,传入一个字符串参数无返回值
publicabstractvoidFunction(Stringvalue);
//抽象事件,类型为系统预定义的代理(delegate):EventHandler
publicabstracteventEventHandlerEvent;
//抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读
publicabstractCharthis[intIndex]
#endregion
#region继承类
publicclassDeriveClass:BaseClass
privateStringattribute;
publicoverrideStringAttribute
get
returnattribute;
set
attribute=value;
publicoverridevoidFunction(Stringvalue)
if(Event!=null)
Event(this,newEventArgs());
publicoverrideeventEventHandlerEvent;
publicoverrideCharthis[intIndex]
returnattribute[Index];
staticvoidOnFunction(objectsender,EventArgse)
for(inti=0;i<((DeriveClass)sender).Attribute.Length;i++)
Console.WriteLine(((DeriveClass)sender)[i]);
DeriveClasstmpObj=newDeriveClass();
tmpObj.Attribute="1234567";
Console.WriteLine(tmpObj.Attribute);
//将静态函数OnFunction与tmpObj对象的Event事件进行关联
tmpObj.Event+=newEventHandler(OnFunction);
tmpObj.Function("7654321");
结果:12345677654321
5.internal修饰符起什么作用?
示例
Example05Lib项目的Class1
namespaceExample05Lib
internalStringstrInternal=null;
publicStringstrPublic;
internalprotectedStringstrInternalProtected=null;
结果Example05Lib项目的Class2类可以访问到Class1的strInternal成员,当然也可以访问到strInternalProtected成员,因为他们在同一个程序集里
Example05项目里的Class3类无法访问到Class1的strInternal成员,因为它们不在同一个程序集里。但却可以访问到strInternalProtected成员,因为Class3是Class1的继承类
Example05项目的Program类既无法访问到Class1的strInternal成员,也无法访问到strInternalProtected成员,因为它们既不在同一个程序集里也不存在继承关系
6.sealed修饰符是干什么的?
答:sealed修饰符表示密封
用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥
用于方法和属性时,表示该方法或属性不能再被重写,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
恰当的利用sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员
namespaceExample06
classA
publicvirtualvoidF()
Console.WriteLine("A.F");
publicvirtualvoidG()
Console.WriteLine("A.G");
classB:A
publicsealedoverridevoidF()
Console.WriteLine("B.F");
publicoverridevoidG()
Console.WriteLine("B.G");
classC:B
Console.WriteLine("C.G");
newA().F();
newA().G();
newB().F();
newB().G();
newC().F();
newC().G();
结果:类B在继承类A时可以重写两个虚函数,如图所示:
由于类B中对F方法进行了密封,类C在继承类B时只能重写一个函数,如图所示:
控制台输出结果,类C的方法F只能是输出类B中对该方法的实现:
A.FA.GB.FB.GB.FC.G
7.override和overload的区别?
答:override表示重写,用于继承类对基类中虚成员的实现
overload表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现
namespaceExample07
classBaseClass
Console.WriteLine("BaseClass.F");
classDeriveClass:BaseClass
publicoverridevoidF()
base.F();
Console.WriteLine("DeriveClass.F");
publicvoidAdd(intLeft,intRight)
Console.WriteLine("AddforInt:{0}",Left+Right);
publicvoidAdd(doubleLeft,doubleRight)
Console.WriteLine("Addforint:{0}",Left+Right);
tmpObj.F();
tmpObj.Add(1,2);
tmpObj.Add(1.1,2.2);
结果:BaseClass.FDeriveClass.FAddforInt:3Addforint:3.3
8.什么是索引指示器?
答:实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int..
简单来说,其本质就是一个含参数属性
namespaceExample08
publicclassPoint
privatedoublex,y;
publicPoint(doubleX,doubleY)
x=X;
y=Y;
//重写ToString方法方便输出
publicoverridestringToString()
returnString.Format("X:{0},Y:{1}",x,y);
publicclassPoints
Point[]points;
publicPoints(Point[]Points)
points=Points;
publicintPointNumber
returnpoints.Length;
//实现索引访问器
publicPointthis[intIndex]
returnpoints[Index];
//索引指示器的实质是含参属性,参数并不只限于int
classWeatherOfWeek
publicstringthis[intIndex]
//注意case段使用return直接返回所以不需要break
switch(Index)
case0:
return"Todayiscloudy!";
case5:
return"Todayisthundershower!";
default:
return"Todayisfine!";
publicstringthis[stringDay]
stringTodayWeather=null;
//switch的标准写法
switch(Day)
case"Sunday":
TodayWeather="Todayiscloudy!";
break;
case"Friday":
TodayWeather="Todayisthundershower!";
TodayWeather="Todayisfine!";
returnTodayWeather;
Point[]tmpPoints=newPoint[10];
for(inti=0;i tmpPoints[i]=newPoint(i,Math.Sin(i)); PointstmpObj=newPoints(tmpPoints); for(inti=0;i Console.WriteLine(tmpObj[i]); string[]Week=newstring[]{"Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday","Staurday"}; WeatherOfWeektmpWeatherOfWeek=newWeatherOfWeek(); for(inti=0;i<6;i++) Console.WriteLine(tmpWeatherOfWeek[i]); foreach(stringtmpDayinWeek) Console.WriteLine(tmpWeatherOfWeek[tmpDay]); 结果:X:0,Y:0X:1,Y:0.841470984807897X:2,Y:0.909297426825682X:3,Y:0.141120008059867X:4,Y:-0.756802495307928X:5,Y:-0.958924274663138X:6,Y:-0.279415498198926X:7,Y:0.656986598718789X:8,Y:0.989358246623382X:9,Y:0.412118485241757Todayiscloudy!Todayisfine!Todayisfine!Todayisfine!Todayisfine!Todayisthundershower!Todayiscloudy!Todayisfine!Todayisfine!Todayisfine!Todayisfine!Todayisthundershower!Todayisfine! 9.new修饰符是起什么作用? 答:new修饰符与new操作符是两个概念 new修饰符只能用于继承类,一般用于弥补基类设计的不足 new修饰符和override修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥 namespaceExample09 publicstaticdoublePI=3.1415; classDervieClass:BaseClass publicnewstaticdoublePI=3.1415926; Console.WriteLine(BaseClass.PI); Console.WriteLine(DervieClass.PI); 结果:3.14153.1415926 10.this关键字的含义? 答:this是一个保留字,仅限于构造函数和方法成员中使用 在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用 this保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化..在C#系统中,this实际上是一个常量,所以不能使用this++这样的运算 namespaceExample10 privatedoublec; privatestringvalue; publicdoubleC returnc; publicClass1(doublec) //限定同名的隐藏成员 this.c=c; publicClass1(Class1value) //用对象本身实例化自己没有意义 if(this!=value) c=value.C; //将对象本身做为参数 returnstring.Format("{0}Celsius={1}Fahrenheit",c, UnitTransClass.C2F(this)); //由于好奇,在这做了一个效率测试,想看看到底哪种方式访问成员变量更快,结论:区别不大。。。 publicstringTest1() longvTickCount=Environment.TickCount; for(inti=0;i<10000000;i++) this.value=i.ToString(); returnstring.Format("Havethis.:{0}MSEL",Environment.TickCount-vTickCount); publicstringTest2() value=i.ToString(); returnstring.Format("Don'thavethis.:{0}MSEL",Environment.TickCount-vTickCount); classUnitTransClass publicstaticdoubleC2F(Class1value) //摄氏到华氏的转换公式 return1.8*value.C+32; Class1tmpObj=newClass1(37.5); Console.WriteLine(tmpObj); Console.WriteLine(tmpObj.Test1()); Console.WriteLine(tmpObj.Test2()); 结果:37.5Celsius=99.5FahrenheitHavethis.:4375MSELDon'thavethis.:4406MSEL 11.可以使用抽象函数重写基类中的虚函数吗? 答:可以 或增加override修饰符,表示抽象重写了基类中该函数的实现 示例: abstractclassDeriveClass1:BaseClass publicabstractnewvoidF(); //是他提醒了我还可以用这种方法抽象重写基类的虚方法 abstractclassDeriveClass2:BaseClass publicabstractoverridevoidF(); 12.密封类可以有虚函数吗? 答:可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数 sealedclassDeriveClass:BaseClass //基类中的虚函数F被隐式的转化为非虚函数 //publicvirtualvoidG() //{ //Console.WriteLine("DeriveClass.G"); //} 13.什么是属性访问器? 答:属性访问器(PropertyAccessor),包括get访问器和set访问器分别用于字段的读写操作其设计目的主要是为了实现面向对象(OO)中的封装思想。根据该思想,字段最好设为private,一个精巧的类最好不要直接把字段设为公有提供给客户调用端直接访问另外要注意属性本身并不一定和字段相联系14.abstract可以和virtual一起使用吗?可以和override一起使用吗? 答:abstract修饰符不可以和static、virtual修饰符一起使用 abstract修饰符可以和override一起使用,参见第11点 namespaceExample14 //在这里,abstract是可以和override一起使用的 15.接口可以包含哪些成员? 答:接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员 16.类和结构的区别? 答:类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存类有构造和析构函数类可以继承和被继承 结构:结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口 示例:根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。 如:Geoemtry(GIS里的一个概论,在OGC标准里有定义)最好使用类,而Geometry中点的成员最好使用结构 namespaceExample16 interfaceIPoint doubleX doubleY doubleZ //结构也可以从接口继承 structPoint:IPoint privatedoublex,y,z; //结构也可以增加构造函数 publicPoint(doubleX,doubleY,doubleZ) this.x=X; this.y=Y; this.z=Z; publicdoubleX get{returnx;} set{x=value;} publicdoubleY publicdoubleZ //在此简化了点状Geometry的设计,实际产品中还包含Project(坐标变换)等复杂操作 classPointGeometry privatePointvalue; publicPointGeometry(doubleX,doubleY,doubleZ) value=newPoint(X,Y,Z); publicPointGeometry(Pointvalue) //结构的赋值将分配新的内存 this.value=value; get{returnvalue.X;} set{this.value.X=value;} get{returnvalue.Y;} set{this.value.Y=value;} get{returnvalue.Z;} set{this.value.Z=value;} publicstaticPointGeometryoperator+(PointGeometryLeft,PointGeometryRigth) returnnewPointGeometry(Left.X+Rigth.X,Left.Y+Rigth.Y,Left.Z+Rigth.Z); returnstring.Format("X:{0},Y:{1},Z:{2}",value.X,value.Y,value.Z); PointtmpPoint=newPoint(1,2,3); PointGeometrytmpPG1=newPointGeometry(tmpPoint); PointGeometrytmpPG2=newPointGeometry(tmpPoint); tmpPG2.X=4; tmpPG2.Y=5; tmpPG2.Z=6; //由于结构是值类型,tmpPG1和tmpPG2的坐标并不一样 Console.WriteLine(tmpPG1); Console.WriteLine(tmpPG2); //由于类是引用类型,对tmpPG1坐标修改后影响到了tmpPG3 PointGeometrytmpPG3=tmpPG1; tmpPG1.X=7; tmpPG1.Y=8; tmpPG1.Z=9; Console.WriteLine(tmpPG3); 结果:X:1,Y:2,Z:3X:4,Y:5,Z:6X:7,Y:8,Z:9X:7,Y:8,Z:9 17.接口的多继承会带来哪些问题? namespaceExample17 interfaceIExample //属性 stringP //方法 stringF(intValue); //事件 eventEventHandlerE; //索引指示器 stringthis[intIndex] interfaceIA intCount{get;set;} interfaceIB intCount(); //IC接口从IA和IB多重继承 interfaceIC:IA,IB classC:IC privateintcount=100; intIA.Count get{return100;} set{count=value;} intIB.Count() returncount*count; CtmpObj=newC(); //调用时也要显式转换 Console.WriteLine("Countproperty:{0}",((IA)tmpObj).Count); Console.WriteLine("Countfunction:{0}",((IB)tmpObj).Count()); 结果:Countproperty:100Countfunction:10000 18.抽象类和接口的区别? 19.别名指示符是什么? 答:通过别名指示符我们可以为某个类型起一个别名主要用于解决两个命名空间内有同名类型的冲突或避免使用冗余的命名空间别名指示符在所有命名空间最外层定义,作用域为整个单元文件。如果定义在某个命名空间内,那么它只在直接隶属的命名空间内起作用 Class1.cs: namespacecom.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01 return"com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01'sClass1"; Class2.cs: namespacecom.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02 return"com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02'sClass1"; 主单元(Program.cs): //使用别名指示符解决同名类型的冲突 //在所有命名空间最外层定义,作用域为整个单元文件 usingLib01Class1=com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1; usingLib02Class2=com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02.Class1; namespaceExample19 namespaceTest1 //Test1Class1在Test1命名空间内定义,作用域仅在Test1之内 usingTest1Class1=com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1; //Lib01Class1和Lib02Class2在这可以正常使用 Lib01Class1tmpObj1=newLib01Class1(); Lib02Class2tmpObj2=newLib02Class2(); //TestClass1在这可以正常使用 Test1Class1tmpObj3=newTest1Class1(); namespaceTest2 usingTest1Class2=com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1; //注意这里,TestClass1在这不可以正常使用。 //因为,在Test2命名空间内不能使用Test1命名空间定义的别名 //Test1Class1tmpObj3=newTest1Class1(); //TestClass2在这可以正常使用 Test1Class2tmpObj3=newTest1Class2(); Console.WriteLine(tmpObj1); Console.WriteLine(tmpObj2); Console.WriteLine(tmpObj3); 结果:com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01'sClass1com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02'sClass1com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01'sClass1 20.如何手工释放资源? 答:.NET平台在内存管理方面提供了GC(GarbageCollection),负责自动释放托管资源和内存回收的工作。但在以下两种情况需要我们手工进行资源释放:一、由于它无法对非托管资源进行释放,所以我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象;二、你的类在运行是会产生大量实例(象GIS中的Geometry),必须自己手工释放这些资源以提高程序的运行效率 namespaceExample20 classClass1:IDisposable //析构函数,编译后变成protectedvoidFinalize(),GC会在回收对象前会调用调用该方法 ~Class1() Dispose(false); //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率 voidIDisposable.Dispose() Dispose(true); //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力 protectedvirtualvoidReleaseUnmanageResources() //Dosomething... //私有函数用以释放非托管资源 privatevoidDispose(booldisposing) ReleaseUnmanageResources(); //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法 //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦 if(disposing) GC.SuppressFinalize(this); //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧 //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些 //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧 ((IDisposable)tmpObj2).Dispose(); 21.P/Invoke是什么? 答:在受控代码与非受控代码进行交互时会产生一个事务(transition),这通常发生在使用平台调用服务(PlatformInvocationServices),即P/Invoke如调用系统的API或与COM对象打交道,通过System.Runtime.InteropServices命名空间虽然使用Interop非常方便,但据估计每次调用事务都要执行10到40条指令,算起来开销也不少,所以我们要尽量少调用事务.如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行少量动作的原则 22.StringBuilder和String的区别? 答:String在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用StringBuilder,不要使用String另外,对于String我们不得不多说几句:1.它是引用类型,在堆上分配内存2.运算时会产生一个新的实例3.String对象一旦生成不可改变(Immutable)4.定义相等运算符(==和!=)是为了比较String对象(而不是引用)的值 namespaceExample22 constintcycle=10000; Stringstr=null; for(inti=0;i str+=i.ToString(); Console.WriteLine("String:{0}MSEL",Environment.TickCount-vTickCount); vTickCount=Environment.TickCount; //看到这个变量名我就生气,奇怪为什么大家都使它呢?:) StringBuildersb=newStringBuilder(); sb.Append(i); Console.WriteLine("StringBuilder:{0}MSEL",Environment.TickCount-vTickCount); stringtmpStr1="A"; stringtmpStr2=tmpStr1; Console.WriteLine(tmpStr1); Console.WriteLine(tmpStr2); //注意后面的输出结果,tmpStr1的值改变并未影响到tmpStr2的值 tmpStr1="B"; 结果:String:375MSELStringBuilder:16MSELAABA 23.explicit和implicit的含义? 答:explicit和implicit属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换 explicti表示显式转换,如从A->B必须进行强制类型转换(B=(B)A)implicit表示隐式转换,如从B->A只需直接赋值(A=B)隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用implicit运算符。不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用explicit运算符,以便在编译期就能警告客户调用端 namespaceExample23 classImmortal publicstringname; publicImmortal(stringName) name=Name; publicstaticimplicitoperatorMonster(Immortalvalue) returnnewMonster(value.name+":神仙变妖怪?偷偷下凡即可。。。"); classMonster publicMonster(stringName) publicstaticexplicitoperatorImmortal(Monstervalue) returnnewImmortal(value.name+":妖怪想当神仙?再去修炼五百年!"); ImmortaltmpImmortal=newImmortal("紫霞仙子"); //隐式转换 MonstertmpObj1=tmpImmortal; Console.WriteLine(tmpObj1.name); MonstertmpMonster=newMonster("孙悟空"); //显式转换 ImmortaltmpObj2=(Immortal)tmpMonster; Console.WriteLine(tmpObj2.name); 结果:紫霞仙子:神仙变妖怪?偷偷下凡即可。。。孙悟空:妖怪想当神仙?再去修炼五百年! 24.params有什么用? 答:params关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力它在只能出现一次并且不能在其后再有参数定义,之前可以 namespaceConsoleApplication1 classApp //第一个参数必须是整型,但后面的参数个数是可变的。 //而且由于定的是object数组,所有的数据类型都可以做为参数传入 publicstaticvoidUseParams(intid,paramsobject[]list) Console.WriteLine(id); for(inti=0;i Console.WriteLine(list[i]); staticvoidMain() //可变参数部分传入了三个参数,都是字符串类型 UseParams(1,"a","b","c"); //可变参数部分传入了四个参数,分别为字符串、整数、浮点数和双精度浮点数数组 UseParams(2,"d",100,33.33,newdouble[]{1.1,2.2}); 结果:1abc2d10033.33System.Double[] 25.什么是反射? 答:反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件 通过对类型动态实例化后,还可以对其执行操作 简单来说就是用string可以在runtime为所欲为的东西,实际上就是一个.netframework内建的万能工厂 一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。) namespaceExample25Lib privatestringname; privateintage; //在此特意不实现,以便在客户调用端体现构造函数的反射实现 //publicClass1() publicClass1(stringName,intAge) age=Age; publicvoidChangeName(stringNewName) name=NewName; publicvoidChangeAge(intNewAge) age=NewAge; returnstring.Format("Name:{0},Age:{1}",name,age); 反射实例化对象并调用其方法,属性和事件的反射调用略去 //注意添加该反射的命名空间 usingSystem.Reflection; namespaceExample25 //加载程序集 AssemblytmpAss=Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory+"Example25Lib.dll"); //遍历程序集内所有的类型,并实例化 Type[]tmpTypes=tmpAss.GetTypes(); foreach(TypetmpTypeintmpTypes) //获取第一个类型的构造函数信息 ConstructorInfo[]tmpConsInfos=tmpType.GetConstructors(); foreach(ConstructorInfotmpConsInfointmpConsInfos) //为构造函数生成调用的参数集合 ParameterInfo[]tmpParamInfos=tmpConsInfo.GetParameters(); object[]tmpParams=newobject[tmpParamInfos.Length]; for(inti=0;i tmpParams[i]=tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName); if(tmpParamInfos[i].ParameterType.FullName=="System.String") tmpParams[i]="Clark"; //实例化对象 objecttmpObj=tmpConsInfo.Invoke(tmpParams); //获取所有方法并执行 foreach(MethodInfotmpMethodintmpType.GetMethods()) //为方法的调用创建参数集合 tmpParamInfos=tmpMethod.GetParameters(); tmpParams=newobject[tmpParamInfos.Length]; tmpParams[i]=tmpAss.CreateInstance (tmpParamInfos[i].ParameterType.FullName); tmpParams[i]="ClarkZheng"; if(tmpParamInfos[i].ParameterType.FullName=="System.Int32") tmpParams[i]=27; tmpMethod.Invoke(tmpObj,tmpParams); //调用完方法后再次打印对象,比较结果 结果:Name:Clark,Age:0Name:ClarkZheng,Age:27总结:通过以上我们可以理解C#中难以理解的概念和示例代码.软件测试题目一、判断题(每题2分,20) 1、软件测试就是为了验证软件功能实现的是否正确,是否完成既定目标的活动,所以软件测试在软件工程的后期才开始具体的工作。(初级)(×) 2、发现错误多的模块,残留在模块中的错误也多。(√)(初级) 3、测试人员在测试过程中发现一处问题,如果问题影响不大,而自己又可以修改,应立即将此问题正确修改,以加快、提高开发的进程。(×)(初级) 4、单元测试通常应该先进行“人工走查”,再以白盒法为主,辅以黑盒法进行动态测试。 (√)(中级) 5、功能测试是系统测试的主要内容,检查系统的功能、性能是否与需求规格说明相同。(√)(中级) 6、软件质量管理即QM由QA和QC构成,软件测试属于QC的核心工作内容。(√)(高级) 7、软件测试只能发现错误,但不能保证测试后的软件没有错误。(√) 8、软件就是程序。(X) 9、测试只要做到语句覆盖和分支覆盖,就可以发现程序中的所有错误。(X) 10、I18N测试是指对产品做出具有国际性的规划,而L10N测试则是指对软件做出符合本地需求更改工作。(√)【高级】 二、选择题(每题2分20) 1、进行软件质量管理的重要性有:(ABCD)【中级】 A、维护降低成本B、法律上的要求C、市场竞争的需要 D、质量标准化的趋势E、软件工程的需要F、CMM过程的一部分 G、方便与客户进一步沟通为后期的实施打好基础 2、以测试的形态分测试可以分为:(ABC)【中级】 A、建构性测试B、系统测试C、专项测试 D、单元测试E、组件测试F、集成测试 3、选出属于黑盒测试方法的选项(ABC)【初级】 A、测试用例覆盖B、输入覆盖C、输出覆盖 D、分支覆盖E、语句覆盖F、条件覆盖 4、编写测试计划的目的是:(ABC)【中级】 A、使测试工作顺利进行B、使项目参与人员沟通更舒畅C、使测试工作更加系统化 D、软件工程以及软件过程的需要E、软件过程规范化的要求F、控制软件质量 5、依存关系有4种分别是:(ABCD)【高级】 A、开始-结束B、开始-开始C、结束-开始 D、结束-结束E、开始-实施-结束F、结束-审核-开始 6、软件质量管理(QM)应有质量保证(QA)和质量控制(QC)组成,下面的选项属于QC得是:(ABC)【高级】 A、测试B、跟踪C、监督 D、制定计划E、需求审查F、程序代码审查 7、实施缺陷跟踪的目的是:(ABCD)【中级】 A、软件质量无法控制B、问题无法量化C、重复问题接连产生 D、解决问题的知识无法保留E、确保缺陷得到解决F、使问题形成完整的闭环处理 8、使用软件测试工具的目的:(ABC)【中级】 D、提高Bug的发现率E、更好的控制缺陷提高软件质量F、更好的协助开发人员 9、典型的瀑布模型的四个阶段是:(ABCD)【高级】 A、分析B、设计C、编码 D、测试E、需求调研F、实施 10、PSP是指个人软件过程,是一种可用于(A)、(B)和(C)个人软件工作方式的自我改善过程。【高级】 A、控制B、管理C、改进 D、高效E、充分F、适宜 三、问答题 1、测试人员在软件开发过程中的任务是什么?(初级)(5分) 答:1、寻找Bug; 2、避免软件开发过程中的缺陷; 3、衡量软件的品质; 总的目标是:确保软件的质量。 2、在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?(初级)(6分) 答:一条Bug记录最基本应包含:编号、Bug所属模块、Bug描述、Bug级别、发现日期、发现人、修改日期、修改人、修改方法、回归结果等等;要有效的发现Bug需参考需求以及详细设计等前期文档设计出高效的测试用例,然后严格执行测试用例,对发现的问题要充分确认肯定,然后再向外发布如此才能提高提交Bug的质量。 3、界面测试题及设计题。请找出下面界面中所存在的问题并分别列出;用黑盒测试的任何一种方法设计出此登陆窗体的测试用例。(中级)(6分) 答:1、窗体的标题栏中为空,没有给出标题。 2、用户名和密码控件的字体不一致并且没有对齐。 3、文本框的大小不一致没有对其。 4、确定和取消按钮控件的大小不一致。 4、黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点!(中级)(5分) 答:黑盒测试的优点有:1)比较简单,不需要了解程序内部的代码及实现; 2)与软件的内部实现无关; 3)从用户角度出发,能很容易的知道用户会用到哪些功能,会遇到哪些问题; 4)基于软件开发文档,所以也能知道软件实现了文档中的哪些功能; 5)在做软件自动化测试时较为方便。 黑盒测试的缺点有:1)不可能覆盖所有的代码,覆盖率较低,大概只能达到总代码量的30%; 2)自动化测试的复用性较低。 白盒测试的优点有: 帮助软件测试人员增大代码的覆盖率,提高代码的质量,发现代码中隐藏的问题。 白盒测试的缺点有: 1)程序运行会有很多不同的路径,不可能测试所有的运行路径; 2)测试基于代码,只能测试开发人员做的对不对,而不能知道设计的正确与否,可能会漏掉一些功能需求; 3)系统庞大时,测试开销会非常大。 5、根据自己的理解回答什么是软件测试,软件测试分为哪几个阶段。(初级)(5分) 答:软件测试是一个为了寻找软件中的错误而运行软件的过程,一个成功的测试是指找到了迄今为止尚未发现的错误的测试。 软件测试一般分为单元测试、集成测试和系统测试。 6、根据自己的理解什么是测试用例和测试规程,设计一个测试用例应当从哪几方面考虑?(中级)(10分) 答:狭义的讲,一个测试用例就是测试人员用以测试被测软件的某个特性或特性组合的一组数据。这组数据可能是从用户处得来的实际的一组数据,也可能是测试人员专门设计出来的测试软件某些功能的一组数据。 测试规程就是详细的对测试用例设计方法、测试方法、测试工具、测试环境和测试数据进行描述的文档,还可以包括能把某个或某一组测试用例应用到被测软件上完成某项测试的一系列的操作步骤。 设计测试用例应当从以下几方面考虑:边界值,等价类划分,有效/无效值等。 7、什么是软件质量保证?软件质量保证人员与开发人员的关系如何?(高级)(10分) 答:软件质量保证就是通过确保软件过程的质量,来保证软件产品的质量。 软件质量保证人员和开发人员之间具有管理上的严格的独立性,两个小组的管理员都不能越权管理另一组,但都可以向更高层的管理者汇报软件开发中的问题 四、设计题 1).输入三个整数,判断三个整数能否构成一个三角形,请用黑盒测试方法中的一种设计出相应的测试用例并详细说明所使用的黑盒测试方法。(中高级)(15分) .NET工程(三) 1.面向对象的思想主要包括什么? 继承多态封装 ●封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。 ●继承:子类拥有父类的所有数据和操作。 ●多态:一个程序中同名的不同方法共存的情况。 有两种形式的多态–重载与重写。 2.什么是ASP.net中的用户控件 问这样的问题,一般是迷惑你.因为新手还是分不清楚用户控件和服务器控件(也称自定义控件)..用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多.. 在C#中,stringstr=null与stringstr=“”的区别。答:stringstr=null是不给他分配内存空间,而stringstr=""给它分配长度为空字符串的内存空间请详述在dotnet中类(class)与结构(struct)的异同Class可以被实例化,属于引用类型,是分配在内存的堆上的,Struct属于值类型,是分配在内存的栈上的. DataReader和DataSet的异同DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作. 8.C#中的接口和类有什么异同。 类是方法功能的实现和集合,接口是规范类.约束类.接口,是可以多继承,类只有单继承.接口强调了你必须实现,而没有具本实现的方法和虚类有点相似 Override与重载有什么区别?一个是重写父类函数,一个是同一个函数的几种形式 触发器的作用 触发器可以查询其它表,而且可以包含复杂的SQL语句。它们主要用于强制复杂的业务规则或要求。触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。保证数据库操作变更能接到通知 <%#%>和<%%>有什么区别?<%#%>表示绑定的数据源<%%>是服务器端代码块 常见的设计模式 抽象工厂模式、适配器模式、外观模式command命令模式,桥接模式,组合模式,装饰模式,状态模式,备忘录模式等。软件设计模式太多,就我的理解简单说一下最常见的MVC模式。MVC模式是1996年由Buschmann提出的:模型(Model):就是封装数据和所有基于对这些数据的操作。视图(View):就是封装的是对数据显示,即用户界面。控制器(Control):就是封装外界作用于模型的操作和对数据流向的控制等。 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 4.列举一下你所了解的XML技术及其应用 5.值类型和引用类型的区别?写出C#的样例代码。 在dotnet中有两大类数据类型,即值类型和引用类型,值类型存贮在栈中,而引用类型存贮在动态的堆中,栈是先进先出的有系统管理的空间,而堆是由应用程序控制的可随时申请和释放该空间,在Donnet中一般情况下有垃圾收集器处理,他们的不同导致在编程上的不同。例:StringBuildera=newStringBuilder();//将StringBuilder的一个首地址传给aStringBuilderb=a;//将StringBuilder的一个首地址传给bb.Append("mxh");Console.WriteLine(a);a=null;Console.WriteLine(b);输出结果:mxhmxh"a=null"的意思是:a的引用置为空但此时StringBuilder的堆空间并没有被释放,因此在此之后,输出b时,仍然可以输出mxh 6.ADO.net中常用的对象有哪些?分别描述一下。 7.如何理解委托? C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。 9.。net中读写数据库需要用到哪些类?他们的作用 10.UDP连接和TCP连接的异同。 11.ASP.net的身份验证方式有哪些?分别是什么原理? window验证:为每个用户开启window帐号,验证其身份.安全性较高.forms验证:为每个登陆用户写入一个身份验证票据..在web使用最广的验证方式..灵活方便. 12.进程和线程分别怎么理解? 13.什么是code-Behind技术。 新建一个VS.NET下的项目..看到ASPX,RESX和CS三个后缀的文件了吗这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理. 14.活动目录的作用。 活动目录是window2000的最重要的功能.可以将用户信息全部集成起来,登陆以后可以访问多个不同的网络服务.. . 15..net中读写XML的类都归属于哪些命名空间? System.XML类 16.解释一下UDDI、WSDL的意义及其作用。 17.什么是SOAP,有哪些应用。 18.如何部署一个ASP.net页面。 19.如何理解.net中的垃圾回收机制。 如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中.然后会搜索新列表中的对象所引用的对象.加入列表中,其他没有被加入列表的对象都会被回收. 20.常用的调用webservice方法有哪些? 我一般用的是WSDL..或者web引用.. 21列举一下你所了解的XML技术及其应用.xml可以用来做网页(xslt)xml可以当作数据库xml可以用来保存对象的系列化xml用于配置,用于保存静态数据类型.接触XML最多的是webServices..和config C#中property与attribute的区别,他们各有什么用处,这种机制的好处在哪里?一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质 C#可否对内存进行直接的操作?可以 维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么 触发器,性能好,事务性 ADO。NET相对于ADO等主要有什么改进? 新增dataset等,不需要随时保持连接,性能提高 ASP。NET与ASP相比,主要有哪些进步?asp解释型,aspx编译型,性能提高,有利于保护源码 C#中的委托是什么?事件是不是一种委托?委托是一种安全的函数指针,事件是一种消息机制 接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?接口用于规范,抽象类用于共性。 存储过程和函数的区别存储过程是编译好的存储在数据库的操作,函数不用说了. 事务是什么?具有原子性特点 游标的作用?如何知道游标已经到了最后?指示当前记录的位置,检查NULL 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。一个是操作前,一个是操作后 请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。session(viewstate)简单,但易丢失application全局cookie简单,但可能不支持,可能被伪造inputtype="hidden"简单,可能被伪造url参数简单,显示于地址栏,长度有限数据库稳定,安全,但性能相对弱 请说明.net中的错误处理机制,并举例trycatchfinal 请说出强名的含义具有自己的key,可以在GAC为公用 请列出c#中几种循环的方法,并指出他们的不同forwileforeach 请指出.net中所有类型的基类object 请指出GAC的含义全局程序集缓存 值类型与引用类型有什么区别?值和指针的区别 怎样理解静态变量?所有实例公用一个的变量 向服务器发送请求有几种方式?getpost 如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理?inputtype=""url数据库 用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?三层,表现,逻辑,数据,安全性,维护性 软件开发过程一般有几个阶段?每个阶段的作用?需求分析,架构设计,代码编写,QA,部署 通过超链接怎样传递中文参数?URLEncodeURLDecode 请编程遍历页面上所有TextBox控件并给它赋值为string.Emptyforeach 有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.同一个名称控件直接,或者反射 如果需记录类的实例个数,该如何实现,请写一个简单的类于以证明.conststaticintclassNum=0;classNum++; A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.构造先父后子,析够反之 需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.stringinputStr="xxxx";inputStr=Regex.Replace(inputStr.Trim(),"*",""); 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义? using指令和语句new创建实例new隐藏基类中方法using引入名称空间或者使用非托管资源new新建实例或者隐藏父类方法 谈谈类和结构的区别?类是引用类型、结构是值类型 什么叫做SQL注入,如何防止?请举例说明。利用sql关键字对网站进行攻击。过滤关键字'等 下面这段代码输出什么?为什么?inti=5;intj=5;if(Object.ReferenceEquals(i,j))Console.WriteLine("Equal");elseConsole.WriteLine("NotEqual"); 写一个实现对一段字符串翻转的方法,附加一些条件,如其中包括“,”、“.”,对其设计测试用例inputStr=inputStr.ToCharArray().Reverse().ToString(); 什么是反射?动态获取程序集信息 用Singleton如何写设计模式static属性里面new,构造函数private C#中的垃圾回收机制是怎样的?三个generation,当每个generation内存满了的时候检查引用,无引用就回收内存 什么是ApplicationPool?Web应用,类似ThreadPool,提高并发性能 链表和数组的区别,各有什么优缺点.一个可以动态增长,一个固定(VB中可以Redim),性能数组教好 什么是虚函数?可以被重写 什么是抽象函数?必须被重写 什么是内存泄漏,怎样最简单的方法判断被存泄漏C++,C中忘了释放内存,内存不会再次分配 什么是XML?可扩展标记语言,可以做配置文件,可以传输数据,可以存储数据 简述private、protected、public、internal修饰符的访问权限。private:私有成员,在类的内部才可以访问。protected:保护成员,该类内部和继承类中可以访问。public:公共成员,完全公开,没有访问限制。internal:在同一命名空间内可以访问。 进程和线程的区别 进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。 成员变量和成员函数前加static的作用 它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。 malloc和new的区别 new是C++的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造函数。可以说new是对象的对象,而malloc不是。本质上new分配内存时,还会在实际内存块的前后加上附加信息,所以new所使用的内存大小比malloc多。 堆和栈的区别 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。栈的动态分配无需释放(是自动的),也就没有释放函数。为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。 在.Net中,类System.Web.UI.Page可以被继承么?可以 你觉得ASP.NET2.0(VS2005)和你以前使用的开发工具(.Net1.0或其他)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern/architecture)可 1ASP.NET2.0把一些代码进行了封装打包,所以相比1.0相同功能减少了很多代码.2同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮助只有在分离的代码文件,无法在页面嵌入服务器端代码获得帮助提示,3代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢4在绑定数据,做表的分页.UPDATE,DELETE,等操作都可以可视化操作,方便了初学者5,在ASP.NET中增加了40多个新的控件,减少了工作量 .net的错误处理机制是什么.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。 重载与覆盖的区别1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。3、覆盖要求参数列表相同;重载要求参数列表不同。4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。 简要谈一下您对微软.NET构架下remoting和webservice两项技术的理解以及实际中的应用。WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。 1.填空:(1)面向对象的语言具有___继承性、封装性、多态性。 (3)列举ADO.net中的五个主要对象 Command、Connection、DataSet、DataAdapter、DataReader。 2.不定项选择: (1)以下叙述正确的是: A.接口中可以有虚方法。B.一个类可以实现多个接口。 C.接口不能被实例化。D.接口中可以包含已实现的方法。 (2)从数据库读取记录,你可能用到的方法有: A.ExecuteNonQueryB.ExecuteScalar C.FillD.ExecuteReader 3.简述private、protected、public、internal修饰符的访问权限。 4.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID 可能不是连续的。) 5.列举ASP.NET页面之间传递值的几种方式。 三种比较常见的方式,一种是可以通过用QueryString来传送相应的值,再一种是通过session变量来传送相应的值,还有就是通过Server.Transfer方法来实现 6.写出程序的输出结果 classClass1{ privatestringstr="Class1.str"; privateinti=0; staticvoidStringConvert(stringstr){ str="stringbeingconverted."; staticvoidStringConvert(Class1c){ c.str="stringbeingconverted."; staticvoidAdd(inti){ i++; staticvoidAddWithRef(refinti){ staticvoidMain(){ inti1=10; inti2=20; stringstr="str"; Class1c=newClass1(); Add(i1); AddWithRef(refi2); Add(c.i); StringConvert(str); StringConvert(c); Console.WriteLine(i1); Console.WriteLine(i2); Console.WriteLine(c.i); Console.WriteLine(str); Console.WriteLine(c.str); 7.写出程序的输出结果 publicabstractclassA publicA() Console.WriteLine('A'); publicvirtualvoidFun() Console.WriteLine("A.Fun()"); publicclassB:A publicB() Console.WriteLine('B'); publicnewvoidFun() Console.WriteLine("B.Fun()"); publicstaticvoidMain() Aa=newB(); a.Fun(); 8.写出程序的输出结果: publicclassA publicvirtualvoidFun1(inti) Console.WriteLine(i); publicvoidFun2(Aa) a.Fun1(1); Fun1(5); publicoverridevoidFun1(inti) base.Fun1(i+1); Bb=newB(); Aa=newA(); a.Fun2(b); b.Fun2(a); 9.一列数的规则如下:1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。(C#语言) ------------------------------------------- a0=0,a1=1,An=An-1+An-2(n>=2)int[]iArray=newint[31];iArray[0]=0;iArray[1]=1;for(inti=2;i<=30;i++){iArray[i]=iArray[i-1]+iArray[i-2];}---------------参考答案二--------------------------------- inti=0,ii=1,s=1,num=0;while(num<=30){s=i+ii;Response.Write(i+"+"+ii+"="+s+" ======================== 10.程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言) 要求:1.要有联动性,老鼠和主人的行为是被动的。 2.考虑可扩展性,猫的叫声可能引起其他联动效应。 三个类,猫,老鼠和主人 猫 publicsealedclassCat //猫叫时引发的事件 publiceventEventHandlerCalling; publicvoidCall() Console.WrietLine("猫叫了..."); if(Calling!=null)//检查是否有事件注册 Calling(this,EventArgs.Empty);//调用事件注册的方法。 //老鼠,提供一个方法表示逃跑 publicsealedcalssMouse publicvoidEscape(objectsender,EventArgse) Console.WriteLine("老鼠逃跑了..."); //主人,发生猫叫的时候惊醒 publicsealedclassMaster publicvoidWakened(objectsender,EventArgse) Console.WriteLine("主人惊醒了...); //用于测试的执行方法 //程序入口点 publicstaticProgram publicstaticintMain(string[]args) //建立猫 Catcat=newCat(); //建立老鼠 Mousemouse=newMouse(); //建立主人 Mastermaster=newMaster(); //注册事件 cat.Calling+=newEventHandler(mouse.Escape); cat.Calling+=newEventHandler(master.Wakened); //猫开始叫 cat.Call(); 要点:1.联动效果,运行代码只要执行Cat.Cryed()方法。2.对老鼠和主人进行抽象评分标准:<1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)<2>从Mouse和Master中提取抽象(5分)<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分) publicinterfaceObserver{voidResponse();//观察者的响应,如是老鼠见到猫的反映}publicinterfaceSubject{voidAimAt(Observerobs);//针对哪些观察者,这里指猫的要扑捉的对象---老鼠}publicclassMouse:Observer{privatestringname;publicMouse(stringname,Subjectsubj){this.name=name;subj.AimAt(this);}publicvoidResponse(){Console.WriteLine(name+"attempttoescape!");}}publicclassMaster:Observer{publicMaster(Subjectsubj){subj.AimAt(this);}publicvoidResponse(){Console.WriteLine("Hostwaken!");}}publicclassCat:Subject{privateArrayListobservers;publicCat(){this.observers=newArrayList();}publicvoidAimAt(Observerobs){this.observers.Add(obs);}publicvoidCry(){Console.WriteLine("Catcryed!");foreach(Observerobsinthis.observers){obs.Response();}}}classMainClass{staticvoidMain(string[]args){Catcat=newCat();Mousemouse1=newMouse("mouse1",cat);Mousemouse2=newMouse("mouse2",cat);Mastermaster=newMaster(cat);cat.Cry();}} ----------------------------- 问题: 1.ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释 Windows|Forms|Passport 2.什么是WEB控件?使用WEB控件有那些优势? 3.请解释ASP。NET中以什么方式进行数据验证? 4.请谈谈对正则表达式的看法? 5.ASP。NET中共有几种类型的控件?各有什么区别? 6.WEB控件可以激法服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。 7.WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用? 8.ASP。NET与ASP相比有什么优势? 9.请解释web.config文件中的重要节点 10.请解释ASP。NET中的web页面与其隐藏类之间的关系? 11.什么是viewstate,能否禁用?是否所用控件都可以禁用 13.当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决 14.请解释一个WEB页面中代码执行次序。 15.请解释什么是上下文对象,在什么情况下要使用上下文对象 16.请解释转发与跳转的区别? 17.请解释ASP.NET中不同页面之间数据传递有那些方式? 18.请解释ASP。NET中buttonlinkbuttonimagebutton及hyperlink这四个控件之间的功别 19.请解释一下。NET多层应用程序中层与层之间以那几种方式进行数据传递。并解释你自己的项目中采用那种方式进行。 20.如果出现ASP。NET中的事件不能触发可能由于什么原因造成? 21.如果需要在datagride控件中的某一列中添加下拉列表框并绑定数据怎么解决? 22.请解释asp.net中的数据绑定与传统数据绑定有什么区别? 23.请解释.net采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别,以图示方式解释。 24.请解释接口的显式实现有什么意义? Q:您在什么情况下会用到虚方法?它与接口有什么不同? Q:值类型与引用类型有什么区别? Q:怎样理解静态变量? Q:向服务器发送请求有几种方式? Q:如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? Q:用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? Q:软件开发过程一般有几个阶段?每个阶段的作用? 需求分析,概要设计,详细设计,软件编码,软件测试 一,可行性分析二,需求分析三,实施和编码四,测试五,维护 Q:微软推出了一系列的ApplicationBlock,请举出您所知道的ApplicationBlock并说明其作用? Q:请列举一些您用到过的设计模式以及在什么情况下使用该模式? Q:您对WebService的体会? 以下几道题目如果您不会,请较为详细的描述您的解决思路和方法 Q:通过超链接怎样传递中文参数? Q:请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? For(i=0;i If(controlisTextBox) (controlasTextBox).Text=string.Empty; Q:请编程实现一个冒泡排序算法? namespaceBubbleSorter publicclassBubbleSorter publicvoidSort(int[]list) inti,j,temp; booldone=false; j=1; while((j done=true; for(i=0;i if(list[i]>list[i+1]) done=false; temp=list[i]; list[i]=list[i+1]; list[i+1]=temp; j++; publicclassMainClass int[]iArrary=newint[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47}; BubbleSortersh=newBubbleSorter(); sh.Sort(iArrary); for(intm=0;m Console.Write("{0}",iArrary[m]); Console.WriteLine(); .NET技术(四) [.NET(C#)]把attribute翻译成特性,用来标识类,方法把property翻译为属性,性质,用于存取类的字段把markup翻译成标记,tag还是翻译成标签比较好 [.NET(C#)].NETFramework的核心是其运行库的执行环境。称为公共语言运行库(CLR)或.NET运行库.通常将在CLR的控制下运行的代码称为托管代码(managedcode).在CLR执行开发的源代码之前,需要编译它们为中间语言(IL),CLR再把IL编译为平台专用的代码。 程序集(assembly)是包含编译好的,面向.NETFramework的代码的逻辑单元.可执行代码和库代码使用相同的程序集结构.程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法. [.NET(C#)]ASP页面有时显示比较慢,因为服务器端代码是解释性的不是编译的.由于ASP代码不是结构化的所以难于维护,加上ASP不支持错误处理和语法检查。而ASP.NET页面是结构化的。每个页面都是一个继承了.NET类System.Web.UI.Page的类。另外ASP.NET的后台编码功能允许进一步采用结构化的方式.页面请求是和WEB服务器在编译后高速缓存ASP.NET页面。 方法参数上的ref方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用ref参数,必须将参数作为ref参数显式传递到方法。ref参数的值被传递到ref参数。传递到ref参数的参数必须最先初始化。将此方法与out参数相比,后者的参数在传递到out参数之前不必显式初始化。属性不是变量,不能作为ref参数传递。 两者都是按地址传递的,使用后都将改变原来的数值。ref可以把参数的数值传递进函数,但是out是要把参数清空就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。两个的区别:ref是有进有出,out是只出不进。 ADO。NET相对于ADO等主要有什么改进?1:ado.net不依赖于oledb提供程序,而是使用.net托管提供的程序,2:不使用com3:不在支持动态游标和服务器端游4:,可以断开connection而保留当前数据集可用5:强类型转换6:xml支持 [.NET(C#)]C#中,stringstr=null与stringstr="",说明区别。stringstr=""初始化对象分配空间而stringstr=null初始化对象 [.NET(C#)]DataGrid的Datasouse可以连接什么数据源DataTableDataViewDataSetDataViewManager任何实现IListSource接口的组件任何实现IList接口的组件 [.NET(C#)]概述反射和序列化反射:公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 序列化:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 [.NET(C#)]可访问性级别有哪几种public访问不受限制。protected访问仅限于包含类或从包含类派生的类型。internal访问仅限于当前程序集。protectedinternal访问仅限于从包含类派生的当前程序集或类型。private访问仅限于包含类型。 [.NET(C#)]O/RMapping的原理:利用反射,配置将对象和数据库表映射。 [.NET(C#)]sealed修饰符有什么特点sealed修饰符表示密封,用于类时,表示该类不能再被继承不能和abstract同时使用,因为这两个修饰符在含义上互相排斥用于方法和属性时,表示该方法或属性不能再被继承,必须和override关键字一起使用因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱恰当的利用sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员 3.内部结构:结构:没有默认的构造函数,但是可以添加构造函数没有析构函数没有abstract和sealed(因为不能继承)不能有protected修饰符可以不使用new初始化在结构中初始化实例字段是错误的类:有默认的构造函数有析构函数可以使用abstract和sealed有protected修饰符必须使用new初始化 接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义staticfinal成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。 当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。 接口可以继承接口。抽像类可以实现(implements)接口抽像类是否可继承实体类(concreteclass),但前提是实体类必须有明确的构造函数。 [.NET(C#)]什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 应用程序域:应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。 托管代码:使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 装箱和拆箱:从值类型接口转换到引用类型:装箱。从引用类型转换到值类型:拆箱。装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到Object引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。拆箱将从对象中提取值类型。 重载:每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。 CTS通用类型系统(commontypesystem):一种确定公共语言运行库如何定义、使用和管理类型的规范。 CLR公共语言运行库:.NETFramework提供了一个称为公共语言运行库的运行时环境.它运行代码并提供使开发过程更轻松的服务。 CLS公共语言规范:要和其他对象完全交互,而不管这些对象是以何种语言实现的.对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。为此定义了公共语言规范(CLS),它是许多应用程序所需的一套基本语言功能。 [.NET(C#)]值类型和引用类型的区别?基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 值类型引用类型内存分配地点分配在栈中分配在堆中效率效率高,不需要地址转换效率低,需要进行地址转换内存回收使用完后,立即回收使用完后,不是立即回收,等待GC回收赋值操作进行复制,创建一个同值新对象只是对原有对象的引用函数参数与返回值是对象的复制是原有对象的引用,并不产生新的对象类型扩展不易扩展容易扩展,方便与类型扩展 [.NET(C#)]如何理解委托委托类似于C++函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。C#2.0版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 [.NET(C#)]C#中的接口和类有什么异同。异:不能直接实例化接口。接口不包含方法的实现。接口、类和结构可从多个接口继承。但是C#只支持单继承:类只能从一个基类继承实现。类定义可在不同的源文件之间进行拆分。 同:接口、类和结构可从多个接口继承。接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。接口可以包含事件、索引器、方法和属性。一个类可以实现多个接口。 [.NET(C#)]ASP.net的身份验证方式有哪些Windows身份验证提供程序提供有关如何将Windows身份验证与MicrosoftInternet信息服务(IIS)身份验证结合使用来确保ASP.NET应用程序安全的信息。 [.NET(C#)]活动目录的作用ActiveDirectory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。ActiveDirectory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。 [.NET(C#)]解释一下UDDI、WSDL的意义及其作用UDDI:统一描述、发现和集成协议(UDDI,UniversalDescription,DiscoveryandIntegration)是一套基于Web的、分布式的、为Web服务提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web服务注册以使得别的企业能够发现的访问协议的实现标准。UDDI提供了一组基于标准的规范用于描述和发现服务,还提供了一组基于因特网的实现。 WSDL:WSDL描述Web服务的公共接口。这是一个基于XML的关于如何与Web服务通讯和使用的服务描述;服务URL和命名空间网络服务的类型(可能还包括SOAP的函数调用,正像我所说过的,WSDL足够自如地去描述网络服务的广泛内容)有效函数列表每个函数的参数每个参数的类型每个函数的返回值及其数据类型 [.NET(C#)]什么是SOAP,有哪些应用。答:SOAP(SimpleObjectAccessProtocol)简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议)可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息。 SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。 最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。 SOAP是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。SOAP利用XML技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。 SOAP定义了一种方法以便将XML消息从A点传送到B点。为此,它提供了一种基于XML且具有以下特性的消息处理框架:1)可扩展2)可通过多种底层网络协议使用3)独立于编程模型。 [.NET(C#)]如何部署一个ASP.net页面VS2005和VS2003都有发布机制。2003可以发布然后再复制部署。VS2005基本上可以直接部署到对应位置。 [.NET(C#)]GC是什么为什么要有GC答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()Runtime.getRuntime().gc()不过在C#中不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法 [.NET(C#)]列举ASP.NET页面之间传递值的几种方式。并说出他们的优缺点。答.1).使用QueryString,如....id=1;response.Redirect()....2).使用Session变量3).使用Server.Transfer session(viewstate)简单,但易丢失application全局cookie简单,但可能不支持,可能被伪造inputttype="hidden"简单,可能被伪造url参数简单,显示于地址栏,长度有限数据库稳定,安全,但性能相对弱 [.NET(C#)]C#中索引器的实现过程,可以用任何类型进行索引?(比如数字) [.NET(C#)]CTS、CLS、CLR分别作何解释?CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 [.NET(C#)].net中读写数据库需要用到那些类?他们的作用?DataSet:数据存储器。DataCommand:执行语句命令。DataAdapter:数据的集合,用语填充。 [.NET(C#)]在.net中,配件的意思是:程序集。(中间语言,源数据,资源,装配清单) [.NET(C#)]常用的调用WebService的方法有哪些?答:1.使用WSDL.exe命令行工具。2.使用VS.NET中的AddWebReference菜单选项 [.NET(C#)]微软.NET构架下remoting和webservice两项技术的理解以及实际中的应用。.netRemoting的工作原理是:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。WS主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。remoting是.net中用来跨越machine,process,appdomain进行方法调用的技术对于三成结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOMWebService是一种构建应用程序的普通模型并能在所有支持internet网通讯的操作系统上实施。WebService令基于组件的开发和web的结合达到最佳 [.NET(C#)]启动一个线程是用run()还是start()答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态。这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 [.NET(C#)]构造器Constructor是否可被override构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 [.NET(C#)]abstract的method不可同时是static,不可同时是native,不可同时是synchronized [.NET(C#)]进程和线程的区别:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位.一个进程可以有多个线程,这些线程共享这个进程的资源。 [.NET(C#)]堆和栈的区别:栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。 [.NET(C#)]成员变量和成员函数前加static的作用:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。 [.NET(C#)]在c#中using和new这两个关键字有什么意义:using引入名称空间或者使用非托管资源new新建实例或者隐藏父类方法 [.NET(C#)]什么是code-Behind技术。答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理. [.NET(C#)]XML与HTML的主要区别1.XML是区分大小写字母的,HTML不区分。2.在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略 [.NET(C#)].net的错误处理机制是什么?答:.net错误处理机制采用try->catch->finally结构.发生错误时,层层上抛,直到找到匹配的Catch为止。 [.NET(C#)]error和exception有什么区别:error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 [.NET(C#)]UDP连接和TCP连接的异同:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结. [.NET(C#)]C#中所有对象共同的基类是:System.Object. [.NET(C#)]System.String和System.StringBuilder有什么区别?System.String是不可变的字符串。String类是final类故不可以继承。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。 [.NET(C#)]const和readonly有什么区别?const可以用于局部常量readonly实际是类的initonly字段,显然不能是局部的。
");if(s==1){i=1;}else{i=s-i;}ii=s;num++;}