- 相關(guān)推薦
筆試題目(綜合版樣題)
題記:一年一度的招聘黃金時(shí)間來(lái)臨了,本人決定整理C#.Net的資料為本人和園子里的朋友共享!C#資料(一)
1.靜態(tài)成員和非靜態(tài)成員的區(qū)別?
答:
靜態(tài)變量使用 static 修飾符進(jìn)行聲明,在類(lèi)被實(shí)例化時(shí)創(chuàng)建,通過(guò)類(lèi)進(jìn)行訪(fǎng)問(wèn)不帶有 static 修飾符聲明的變量稱(chēng)做非靜態(tài)變量,在對(duì)象被實(shí)例化時(shí)創(chuàng)建,通過(guò)對(duì)象進(jìn)行訪(fǎng)問(wèn)一個(gè)類(lèi)的所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值,同一個(gè)類(lèi)的不同實(shí)例的同一非靜態(tài)變量可以是不同的值靜態(tài)函數(shù)的實(shí)現(xiàn)里不能使用非靜態(tài)成員,如非靜態(tài)變量、非靜態(tài)函數(shù)等
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example01
{
class Program
{
class Class1
{
public static String staticStr = "Class";
public String notstaticStr = "Obj";
}
static void Main(string[] args)
{
//靜態(tài)變量通過(guò)類(lèi)進(jìn)行訪(fǎng)問(wèn),該類(lèi)所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值
Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);
Class1 tmpObj1 = new Class1();
tmpObj1.notstaticStr = "tmpObj1";
Class1 tmpObj2 = new Class1();
tmpObj2.notstaticStr = "tmpObj2";
//非靜態(tài)變量通過(guò)對(duì)象進(jìn)行訪(fǎng)問(wèn),不同對(duì)象的同一非靜態(tài)變量可以有不同的值
Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);
Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);
Console.ReadLine();
}
}
}
結(jié)果:
Class1's staticStr: Class
tmpObj1's notstaticStr: tmpObj1
tmpObj2's notstaticStr: tmpObj2
2.const 和 static readonly 區(qū)別?
答:const
用 const 修飾符聲明的成員叫常量,是在編譯期初始化并嵌入到客戶(hù)端程序
static readonly
用 static readonly 修飾符聲明的成員依然是變量,只不過(guò)具有和常量類(lèi)似的使用方法:通過(guò)類(lèi)進(jìn)行訪(fǎng)問(wèn)、初始化后不可以修改。但與常量不同的是這種變量是在運(yùn)行期初始化
示例:
測(cè)試類(lèi):
using System;
using System.Collections.Generic;
using System.Text;
namespace Example02Lib
{
public class Class1
{
public const String strConst = "Const";
public static readonly String strStaticReadonly = "StaticReadonly";
//public const String strConst = "Const Changed";
//public static readonly String strStaticReadonly = "StaticReadonly
Changed";
}
}
客戶(hù)端代碼:
using System;
using System.Collections.Generic;
using System.Text;
using Example02Lib;
namespace Example02
{
class Program
{
static void Main(string[] args)
{
//修改Example02中Class1的strConst初始值后,只編譯Example02Lib項(xiàng)目
//然后到資源管理器里把新編譯的Example02Lib.dll拷貝Example02.exe所在的目錄,
執(zhí)行Example02.exe
//切不可在IDE里直接調(diào)試運(yùn)行因?yàn)檫@會(huì)重新編譯整個(gè)解決方案!
//可以看到strConst的輸出沒(méi)有改變,而strStaticReadonly的輸出已經(jīng)改變
//表明Const變量是在編譯期初始化并嵌入到客戶(hù)端程序,而StaticReadonly是在運(yùn)行時(shí)初始化的
Console.WriteLine("strConst : {0}", Class1.strConst);
Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);
Console.ReadLine();
}
}
}
結(jié)果:
strConst : Const
strStaticReadonly : StaticReadonly
修改后的示例:
測(cè)試類(lèi):
using System;
using System.Collections.Generic;
using System.Text;
namespace Example02Lib
{
public class Class1
{
//public const String strConst = "Const";
//public static readonly String strStaticReadonly = "StaticReadonly";
public const String strConst = "Const Changed";
public static readonly String strStaticReadonly = "StaticReadonly Changed";
}
}
結(jié)果
strConst : Const
strStaticReadonly : StaticReadonly Changed
3.extern 是什么意思?
答:extern 修飾符用于聲明由程序集外部實(shí)現(xiàn)的成員函數(shù)經(jīng)常用于系統(tǒng)API函數(shù)的調(diào)用(通過(guò) DllImport )。注意,和DllImport一起使用時(shí)要加上 static 修飾符也可以用于對(duì)于同一程序集不同版本組件的調(diào)用(用 extern 聲明別名)不能與 abstract 修飾符同時(shí)使用
示例:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace Example03
{
class Program
{
//注意DllImport是一個(gè)Attribute Property,在System.Runtime.InteropServices命名空間中定義
//extern與DllImport一起使用時(shí)必須再加上一個(gè)static修飾符
[DllImport("User32.dll")]
public static extern int MessageBox(int Handle, string Message,
string Caption, int Type);
static int Main()
{
string myString;
Console.Write("Enter your message: ");
myString = Console.ReadLine();
return MessageBox(0, myString, "My Message Box", 0);4.abstract 是什么意思?
答:abstract 修飾符可以用于類(lèi)、方法、屬性、事件和索引指示器(indexer),表示其為抽象成員.abstract 不可以和 static 、virtual 一起使用聲明為 abstract 成員可以不包括實(shí)現(xiàn)代碼,但只要類(lèi)中還有未實(shí)現(xiàn)的抽象成員(即抽象類(lèi)),那么它的對(duì)象就不能被實(shí)例化,通常用于強(qiáng)制繼承類(lèi)必須實(shí)現(xiàn)某一成員
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example04{#region 基類(lèi),抽象類(lèi)public abstract class BaseClass{//抽象屬性,同時(shí)具有g(shù)et和set訪(fǎng)問(wèn)器表示繼承類(lèi)必須將該屬性實(shí)現(xiàn)為可讀寫(xiě)public abstract String Attribute{get;set;}//抽象方法,傳入一個(gè)字符串參數(shù)無(wú)返回值public abstract void Function(String value);//抽象事件,類(lèi)型為系統(tǒng)預(yù)定義的代理(delegate):EventHandlerpublic abstract event EventHandler Event;//抽象索引指示器,只具有g(shù)et訪(fǎng)問(wèn)器表示繼承類(lèi)必須將該索引指示器實(shí)現(xiàn)為只讀public abstract Char this[int Index]{get;}}#endregion#region 繼承類(lèi)public class DeriveClass : BaseClass{private String attribute;public override String Attribute{get{return attribute;}set{attribute = value;}}public override void Function(String value){attribute = value;if (Event != null){Event(this, new EventArgs());}}public override event EventHandler Event;public override Char this[int Index]{get{return attribute[Index];}}}#endregionclass Program{static void OnFunction(object sender, EventArgs e){for (int i = 0; i < ((DeriveClass)sender).Attribute.Length; i++){Console.WriteLine(((DeriveClass)sender)[i]);}}static void Main(string[] args){DeriveClass tmpObj = new DeriveClass();tmpObj.Attribute = "1234567";Console.WriteLine(tmpObj.Attribute);//將靜態(tài)函數(shù)OnFunction與tmpObj對(duì)象的Event事件進(jìn)行關(guān)聯(lián)tmpObj.Event += new EventHandler(OnFunction);tmpObj.Function("7654321");Console.ReadLine();}}}結(jié)果:
1234567
7
6
5
4
3
2
15.internal 修飾符起什么作用?
答:internal 修飾符可以用于類(lèi)型或成員,使用該修飾符聲明的類(lèi)型或成員只能在同一程集內(nèi)訪(fǎng)問(wèn)接口的成員不能使用 internal 修飾符值得注意的是,如果為 internal 成員加上了 protected 修飾符,這時(shí)的訪(fǎng)問(wèn)級(jí)別為 internal 或 protected。只是看字面意思容易弄錯(cuò),許多人認(rèn)為 internal protected 應(yīng)該是“只有同一個(gè)程序集中的子類(lèi)可以訪(fǎng)問(wèn)”,但其實(shí)它表示“同一個(gè)程序集中的所有類(lèi),以及所有程序集中的子類(lèi)都可以訪(fǎng)問(wèn)”
示例
Example05Lib 項(xiàng)目的 Class1
using System;using System.Collections.Generic;using System.Text;namespace Example05Lib{public class Class1{internal String strInternal = null;public String strPublic;internal protected String strInternalProtected = null;}}結(jié)果
Example05Lib 項(xiàng)目的 Class2 類(lèi)可以訪(fǎng)問(wèn)到 Class1 的 strInternal 成員,當(dāng)然也可以訪(fǎng)問(wèn)到 strInternalProtected 成員,因?yàn)樗麄冊(cè)谕粋(gè)程序集里
Example05 項(xiàng)目里的 Class3 類(lèi)無(wú)法訪(fǎng)問(wèn)到 Class1 的 strInternal 成員,因?yàn)樗鼈儾辉谕粋(gè)程序集里。但卻可以訪(fǎng)問(wèn)到 strInternalProtected 成員,因?yàn)?Class3 是 Class1 的繼承類(lèi)
Example05 項(xiàng)目的 Program 類(lèi)既無(wú)法訪(fǎng)問(wèn)到 Class1 的 strInternal 成員,也無(wú)法訪(fǎng)問(wèn)到 strInternalProtected 成員,因?yàn)樗鼈兗炔辉谕粋(gè)程序集里也不存在繼承關(guān)系
6.sealed 修飾符是干什么的?答:sealed 修飾符表示密封
用于類(lèi)時(shí),表示該類(lèi)不能再被繼承,不能和 abstract 同時(shí)使用,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥
用于方法和屬性時(shí),表示該方法或?qū)傩圆荒茉俦恢貙?xiě),必須和 override 關(guān)鍵字一起使用,因?yàn)槭褂?sealed 修飾符的方法或?qū)傩钥隙ㄊ腔?lèi)中相應(yīng)的虛成員
通常用于實(shí)現(xiàn)第三方類(lèi)庫(kù)時(shí)不想被客戶(hù)端繼承,或用于沒(méi)有必要再繼承的類(lèi)以防止濫用繼承造成層次結(jié)構(gòu)體系混亂
恰當(dāng)?shù)睦?sealed 修飾符也可以提高一定的運(yùn)行效率,因?yàn)椴挥每紤]繼承類(lèi)會(huì)重寫(xiě)該成員
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example06{class Program{class A{public virtual void F(){Console.WriteLine("A.F");}public virtual void G(){Console.WriteLine("A.G");}}class B : A{public sealed override void F(){Console.WriteLine("B.F");}public override void G(){Console.WriteLine("B.G");}}class C : B{public override void G(){Console.WriteLine("C.G");}}static void Main(string[] args){new A().F();new A().G();new B().F();new B().G();new C().F();new C().G();Console.ReadLine();}}}結(jié)果:
類(lèi) B 在繼承類(lèi) A 時(shí)可以重寫(xiě)兩個(gè)虛函數(shù),如圖所示:由于類(lèi) B 中對(duì) F 方法進(jìn)行了密封, 類(lèi) C 在繼承類(lèi) B 時(shí)只能重寫(xiě)一個(gè)函數(shù),如圖所示:
控制臺(tái)輸出結(jié)果,類(lèi) C 的方法 F 只能是輸出 類(lèi)B 中對(duì)該方法的實(shí)現(xiàn):
A.F
A.G
B.F
B.G
B.F
C.G
7.override 和 overload 的區(qū)別?答:override 表示重寫(xiě),用于繼承類(lèi)對(duì)基類(lèi)中虛成員的實(shí)現(xiàn)
overload 表示重載,用于同一個(gè)類(lèi)中同名方法不同參數(shù)(包括類(lèi)型不同或個(gè)數(shù)不同)的實(shí)現(xiàn)
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example07{class Program{class BaseClass{public virtual void F(){Console.WriteLine("BaseClass.F");}}class DeriveClass : BaseClass{public override void F(){base.F();Console.WriteLine("DeriveClass.F");}public void Add(int Left, int Right){Console.WriteLine("Add for Int: {0}", Left + Right);}public void Add(double Left, double Right){Console.WriteLine("Add for int: {0}", Left + Right);}}static void Main(string[] args){DeriveClass tmpObj = new DeriveClass();tmpObj.F();tmpObj.Add(1, 2);tmpObj.Add(1.1, 2.2);Console.ReadLine();}}}結(jié)果:
BaseClass.F
DeriveClass.F
Add for Int: 3
Add for int: 3.38.什么是索引指示器?
答:實(shí)現(xiàn)索引指示器(indexer)的類(lèi)可以象數(shù)組那樣使用其實(shí)例后的對(duì)象,但與數(shù)組不同的是索引指示器的參數(shù)類(lèi)型不僅限于int..
簡(jiǎn)單來(lái)說(shuō),其本質(zhì)就是一個(gè)含參數(shù)屬性
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example08{public class Point{private double x, y;public Point(double X, double Y){x = X;y = Y;}//重寫(xiě)ToString方法方便輸出public override string ToString(){return String.Format("X: {0} , Y: {1}", x, y);}}public class Points{Point[] points;public Points(Point[] Points){points = Points;}public int PointNumber{get{return points.Length;}}//實(shí)現(xiàn)索引訪(fǎng)問(wèn)器public Point this[int Index]{get{return points[Index];}}}//感謝watson hua(http://huazhihao.cnblogs.com/)的指點(diǎn)//索引指示器的實(shí)質(zhì)是含參屬性,參數(shù)并不只限于intclass WeatherOfWeek{public string this[int Index]{get{//注意case段使用return直接返回所以不需要breakswitch (Index){case 0:{return "Today is cloudy!";}case 5:{return "Today is thundershower!";}default:{return "Today is fine!";}}}}public string this[string Day]{get{string TodayWeather = null;//switch的標(biāo)準(zhǔn)寫(xiě)法switch (Day){case "Sunday":{TodayWeather = "Today is cloudy!";break;}case "Friday":{TodayWeather = "Today is thundershower!";break;}default:{TodayWeather = "Today is fine!";break;}}return TodayWeather;}}}class Program{static void Main(string[] args){Point[] tmpPoints = new Point[10];for (int i = 0; i < tmpPoints.Length; i++){tmpPoints[i] = new Point(i, Math.Sin(i));}Points tmpObj = new Points(tmpPoints);for (int i = 0; i < tmpObj.PointNumber; i++){Console.WriteLine(tmpObj[i]);}string[] Week = new string[] { "Sunday", "Monday", "Tuesday","Wednesday", "Thursday", "Friday", "Staurday"};WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();for (int i = 0; i < 6; i++){Console.WriteLine(tmpWeatherOfWeek[i]);}foreach (string tmpDay in Week){Console.WriteLine(tmpWeatherOfWeek[tmpDay]);}Console.ReadLine();}}}結(jié)果:
X: 0 , Y: 0
X: 1 , Y: 0.841470984807897
X: 2 , Y: 0.909297426825682
X: 3 , Y: 0.141120008059867
X: 4 , Y: -0.756802495307928
X: 5 , Y: -0.958924274663138
X: 6 , Y: -0.279415498198926
X: 7 , Y: 0.656986598718789
X: 8 , Y: 0.989358246623382
X: 9 , Y: 0.412118485241757
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is cloudy!
Today is fine!
Today is fine!
Today is fine!
Today is fine!
Today is thundershower!
Today is fine!9.new 修飾符是起什么作用?
答:new 修飾符與 new 操作符是兩個(gè)概念
new 修飾符用于聲明類(lèi)或類(lèi)的成員,表示隱藏了基類(lèi)中同名的成員。而new 操作符用于實(shí)例化一個(gè)類(lèi)型
new 修飾符只能用于繼承類(lèi),一般用于彌補(bǔ)基類(lèi)設(shè)計(jì)的不足
new 修飾符和 override 修飾符不可同時(shí)用在一個(gè)成員上,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example09{class BaseClass{//基類(lèi)設(shè)計(jì)者聲明了一個(gè)PI的公共變量,方便進(jìn)行運(yùn)算public static double PI = 3.1415;}class DervieClass : BaseClass{//繼承類(lèi)發(fā)現(xiàn)該變量的值不能滿(mǎn)足運(yùn)算精度,于是可以通過(guò)new修飾符顯式隱藏基類(lèi)中的聲明public new static double PI = 3.1415926;}class Program{static void Main(string[] args){Console.WriteLine(BaseClass.PI);Console.WriteLine(DervieClass.PI);Console.ReadLine();}}}結(jié)果:
3.1415
3.141592610.this 關(guān)鍵字的含義?
答:this 是一個(gè)保留字,僅限于構(gòu)造函數(shù)和方法成員中使用
在類(lèi)的構(gòu)造函數(shù)中出現(xiàn)表示對(duì)正在構(gòu)造的對(duì)象本身的引用,在類(lèi)的方法中出現(xiàn)表示對(duì)調(diào)用該方法的對(duì)象的引用,在結(jié)構(gòu)的構(gòu)造上函數(shù)中出現(xiàn)表示對(duì)正在構(gòu)造的結(jié)構(gòu)的引用,在結(jié)構(gòu)的方法中出現(xiàn)表示對(duì)調(diào)用該方法的結(jié)果的引用
this 保留字不能用于靜態(tài)成員的實(shí)現(xiàn)里,因?yàn)檫@時(shí)對(duì)象或結(jié)構(gòu)并未實(shí)例化..在 C# 系統(tǒng)中,this 實(shí)際上是一個(gè)常量,所以不能使用 this++ 這樣的運(yùn)算
this 保留字一般用于限定同名的隱藏成員、將對(duì)象本身做為參數(shù)、聲明索引訪(fǎng)問(wèn)器、判斷傳入?yún)?shù)的對(duì)象是否為本身
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example10{class Class1{private double c;private string value;public double C{get{return c;}}public Class1(double c){//限定同名的隱藏成員this.c = c;}public Class1(Class1 value){//用對(duì)象本身實(shí)例化自己沒(méi)有意義if (this != value){c = value.C;}}public override string ToString(){//將對(duì)象本身做為參數(shù)return string.Format("{0} Celsius = {1} Fahrenheit", c,
UnitTransClass.C2F(this));
}//由于好奇,在這做了一個(gè)效率測(cè)試,想看看到底哪種方式訪(fǎng)問(wèn)成員變量更快,結(jié)論:區(qū)別不大。。。public string Test1(){long vTickCount = Environment.TickCount;for (int i = 0; i < 10000000; i++)this.value = i.ToString();return string.Format("Have this.: {0} MSEL", Environment.TickCount - vTickCount);}public string Test2(){long vTickCount = Environment.TickCount;for (int i = 0; i < 10000000; i++)value = i.ToString();return string.Format("Don't have this.: {0} MSEL", Environment.TickCount - vTickCount);}}class UnitTransClass{public static double C2F(Class1 value){//攝氏到華氏的轉(zhuǎn)換公式return 1.8 * value.C + 32;}}class Program{static void Main(string[] args){Class1 tmpObj = new Class1(37.5);Console.WriteLine(tmpObj);Console.WriteLine(tmpObj.Test1());Console.WriteLine(tmpObj.Test2());Console.ReadLine();}}}結(jié)果:
37.5 Celsius = 99.5 Fahrenheit
Have this.: 4375 MSEL
Don't have this.: 4406 MSEL11.可以使用抽象函數(shù)重寫(xiě)基類(lèi)中的虛函數(shù)嗎?
答:可以
需使用 new 修飾符顯式聲明,表示隱藏了基類(lèi)中該函數(shù)的實(shí)現(xiàn)
或增加 override 修飾符,表示抽象重寫(xiě)了基類(lèi)中該函數(shù)的實(shí)現(xiàn)
示例:
class BaseClass{public virtual void F(){Console.WriteLine("BaseClass.F");}}abstract class DeriveClass1 : BaseClass{public abstract new void F();}//感謝watson hua(http://huazhihao.cnblogs.com/)的指點(diǎn)//是他提醒了我還可以用這種方法抽象重寫(xiě)基類(lèi)的虛方法abstract class DeriveClass2 : BaseClass{public abstract override void F();}12.密封類(lèi)可以有虛函數(shù)嗎?
答:可以,基類(lèi)中的虛函數(shù)將隱式的轉(zhuǎn)化為非虛函數(shù),但密封類(lèi)本身不能再增加新的虛函數(shù)
示例:
class BaseClass{public virtual void F(){Console.WriteLine("BaseClass.F");}}sealed class DeriveClass : BaseClass{//基類(lèi)中的虛函數(shù)F被隱式的轉(zhuǎn)化為非虛函數(shù)//密封類(lèi)中不能再聲明新的虛函數(shù)G//public virtual void G()//{// Console.WriteLine("DeriveClass.G");//}}13.什么是屬性訪(fǎng)問(wèn)器?
答:屬性訪(fǎng)問(wèn)器(Property Accessor),包括 get 訪(fǎng)問(wèn)器和 set 訪(fǎng)問(wèn)器分別用于字段的讀寫(xiě)操作
其設(shè)計(jì)目的主要是為了實(shí)現(xiàn)面向?qū)ο螅∣O)中的封裝思想。根據(jù)該思想,字段最好設(shè)為private,一個(gè)精巧的類(lèi)最好不要直接把字段設(shè)為公有提供給客戶(hù)調(diào)用端直接訪(fǎng)問(wèn)
另外要注意屬性本身并不一定和字段相聯(lián)系
14.abstract 可以和 virtual 一起使用嗎?可以和 override 一起使用嗎?答:abstract 修飾符不可以和 static、virtual 修飾符一起使用
abstract 修飾符可以和 override 一起使用,參見(jiàn)第11點(diǎn)
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example14{class BaseClass{public virtual void F(){Console.WriteLine("BaseClass.F");}}abstract class DeriveClass1 : BaseClass{//在這里, abstract是可以和override一起使用的public abstract override void F();}class Program{static void Main(string[] args){}}}15.接口可以包含哪些成員?
答:接口可以包含屬性、方法、索引指示器和事件,
但不能包含常量、域、操作符、構(gòu)造函數(shù)和析構(gòu)函數(shù),而且也不能包含任何靜態(tài)成員16.類(lèi)和結(jié)構(gòu)的區(qū)別?
答:類(lèi):類(lèi)是引用類(lèi)型在堆上分配,類(lèi)的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對(duì)象分配的內(nèi)存
類(lèi)有構(gòu)造和析構(gòu)函數(shù)
類(lèi)可以繼承和被繼承結(jié)構(gòu):
結(jié)構(gòu)是值類(lèi)型在棧上分配(雖然棧的訪(fǎng)問(wèn)速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)的賦值將分配產(chǎn)生一個(gè)新的對(duì)象。
結(jié)構(gòu)沒(méi)有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)沒(méi)有析構(gòu)函數(shù)
結(jié)構(gòu)不可以繼承自另一個(gè)結(jié)構(gòu)或被繼承,但和類(lèi)一樣可以繼承自接口示例:根據(jù)以上比較,我們可以得出一些輕量級(jí)的對(duì)象最好使用結(jié)構(gòu),但數(shù)據(jù)量大或有復(fù)雜處理邏輯對(duì)象最好使用類(lèi)。
如:Geoemtry(GIS 里的一個(gè)概論,在 OGC 標(biāo)準(zhǔn)里有定義) 最好使用類(lèi),而 Geometry 中點(diǎn)的成員最好使用結(jié)構(gòu)
using System;using System.Collections.Generic;using System.Text;namespace Example16{interface IPoint{double X{get;set;}double Y{get;set;}double Z{get;set;}}//結(jié)構(gòu)也可以從接口繼承struct Point: IPoint{private double x, y, z;//結(jié)構(gòu)也可以增加構(gòu)造函數(shù)public Point(double X, double Y, double Z){this.x = X;this.y = Y;this.z = Z;}public double X{get { return x; }set { x = value; }}public double Y{get { return x; }set { x = value; }}public double Z{get { return x; }set { x = value; }}}//在此簡(jiǎn)化了點(diǎn)狀Geometry的設(shè)計(jì),實(shí)際產(chǎn)品中還包含Project(坐標(biāo)變換)等復(fù)雜操作class PointGeometry{private Point value;public PointGeometry(double X, double Y, double Z){value = new Point(X, Y, Z);}public PointGeometry(Point value){//結(jié)構(gòu)的賦值將分配新的內(nèi)存this.value = value;}public double X{get { return value.X; }set { this.value.X = value; }}public double Y{get { return value.Y; }set { this.value.Y = value; }}public double Z{get { return value.Z; }set { this.value.Z = value; }}public static PointGeometry operator +(PointGeometry Left, PointGeometry Rigth){return new PointGeometry(Left.X + Rigth.X, Left.Y + Rigth.Y, Left.Z + Rigth.Z);}public override string ToString(){return string.Format("X: {0}, Y: {1}, Z: {2}", value.X, value.Y, value.Z);}}class Program{static void Main(string[] args){Point tmpPoint = new Point(1, 2, 3);PointGeometry tmpPG1 = new PointGeometry(tmpPoint);PointGeometry tmpPG2 = new PointGeometry(tmpPoint);tmpPG2.X = 4;tmpPG2.Y = 5;tmpPG2.Z = 6;//由于結(jié)構(gòu)是值類(lèi)型,tmpPG1 和 tmpPG2 的坐標(biāo)并不一樣Console.WriteLine(tmpPG1);Console.WriteLine(tmpPG2);//由于類(lèi)是引用類(lèi)型,對(duì)tmpPG1坐標(biāo)修改后影響到了tmpPG3PointGeometry tmpPG3 = tmpPG1;tmpPG1.X = 7;tmpPG1.Y = 8;tmpPG1.Z = 9;Console.WriteLine(tmpPG1);Console.WriteLine(tmpPG3);Console.ReadLine();}}}結(jié)果:
X: 1, Y: 2, Z: 3
X: 4, Y: 5, Z: 6
X: 7, Y: 8, Z: 9
X: 7, Y: 8, Z: 917.接口的多繼承會(huì)帶來(lái)哪些問(wèn)題?
答:C# 中的接口與類(lèi)不同,可以使用多繼承,即一個(gè)子接口可以有多個(gè)父接口。但如果兩個(gè)父成員具有同名的成員,就產(chǎn)生了二義性(這也正是 C# 中類(lèi)取消了多繼承的原因之一),這時(shí)在實(shí)現(xiàn)時(shí)最好使用顯式的聲明
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example17{class Program{//一個(gè)完整的接口聲明示例interface IExample{//屬性string P{get;set;}//方法string F(int Value);//事件event EventHandler E;//索引指示器string this[int Index]{get;set;}}interface IA{int Count { get; set;}}interface IB{int Count();}//IC接口從IA和IB多重繼承interface IC : IA, IB{}class C : IC{private int count = 100;//顯式聲明實(shí)現(xiàn)IA接口中的Count屬性int IA.Count{get { return 100; }set { count = value; }}//顯式聲明實(shí)現(xiàn)IB接口中的Count方法int IB.Count(){return count * count;}}static void Main(string[] args){C tmpObj = new C();//調(diào)用時(shí)也要顯式轉(zhuǎn)換Console.WriteLine("Count property: {0}", ((IA)tmpObj).Count);Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());Console.ReadLine();}}}結(jié)果:
Count property: 100
Count function: 1000018.抽象類(lèi)和接口的區(qū)別?
答:抽象類(lèi)(abstract class)可以包含功能定義和實(shí)現(xiàn),接口(interface)只能包含功能定義
抽象類(lèi)是從一系列相關(guān)對(duì)象中抽象出來(lái)的概念, 因此反映的是事物的內(nèi)部共性;接口是為了滿(mǎn)足外部調(diào)用而定義的一個(gè)功能約定, 因此反映的是事物的外部特性
分析對(duì)象,提煉內(nèi)部共性形成抽象類(lèi),用以表示對(duì)象本質(zhì),即“是什么”
為外部提供調(diào)用或功能需要擴(kuò)充時(shí)優(yōu)先使用接口19.別名指示符是什么?
答:通過(guò)別名指示符我們可以為某個(gè)類(lèi)型起一個(gè)別名
主要用于解決兩個(gè)命名空間內(nèi)有同名類(lèi)型的沖突或避免使用冗余的命名空間
別名指示符在所有命名空間最外層定義,作用域?yàn)檎麄(gè)單元文件。如果定義在某個(gè)命名空間內(nèi),那么它只在直接隸屬的命名空間內(nèi)起作用示例:
Class1.cs:
using System;using System.Collections.Generic;using System.Text;namespace com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01{class Class1{public override string ToString(){return "com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01's Class1";}}}Class2.cs:
using System;using System.Collections.Generic;using System.Text;namespace com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02{class Class1{public override string ToString(){return "com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02's Class1";}}}主單元(Program.cs):
using System;using System.Collections.Generic;using System.Text;//使用別名指示符解決同名類(lèi)型的沖突//在所有命名空間最外層定義,作用域?yàn)檎麄(gè)單元文件using Lib01Class1 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;using Lib02Class2 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02.Class1;namespace Example19{namespace Test1{//Test1Class1在Test1命名空間內(nèi)定義,作用域僅在Test1之內(nèi)using Test1Class1 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;class Class1{//Lib01Class1和Lib02Class2在這可以正常使用Lib01Class1 tmpObj1 = new Lib01Class1();Lib02Class2 tmpObj2 = new Lib02Class2();//TestClass1在這可以正常使用Test1Class1 tmpObj3 = new Test1Class1();}}namespace Test2{using Test1Class2 = com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01.Class1;class Program{static void Main(string[] args){//Lib01Class1和Lib02Class2在這可以正常使用Lib01Class1 tmpObj1 = new Lib01Class1();Lib02Class2 tmpObj2 = new Lib02Class2();//注意這里,TestClass1在這不可以正常使用。//因?yàn),在Test2命名空間內(nèi)不能使用Test1命名空間定義的別名//Test1Class1 tmpObj3 = new Test1Class1();//TestClass2在這可以正常使用Test1Class2 tmpObj3 = new Test1Class2();Console.WriteLine(tmpObj1);Console.WriteLine(tmpObj2);Console.WriteLine(tmpObj3);Console.ReadLine();}}}}
結(jié)果:
com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01's Class1
com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib02's Class1
com.nblogs.reonlyrun.CSharp25QExample.Example19.Lib01's Class1
20.如何手工釋放資源?
答: .NET 平臺(tái)在內(nèi)存管理方面提供了GC(Garbage Collection),負(fù)責(zé)自動(dòng)釋放托管資源和內(nèi)存回收的工作。但在以下兩種情況需要我們手工進(jìn)行資源釋放:一、由于它無(wú)法對(duì)非托管資源進(jìn)行釋放,所以我們必須自己提供方法來(lái)釋放對(duì)象內(nèi)分配的非托管資源,比如你在對(duì)象的實(shí)現(xiàn)代碼中使用了一個(gè)COM對(duì)象;二、你的類(lèi)在運(yùn)行是會(huì)產(chǎn)生大量實(shí)例(象 GIS 中的Geometry),必須自己手工釋放這些資源以提高程序的運(yùn)行效率
最理想的辦法是通過(guò)實(shí)現(xiàn)一個(gè)接口顯式的提供給客戶(hù)調(diào)用端手工釋放對(duì)象,System 命名空間內(nèi)有一個(gè) IDisposable 接口,拿來(lái)做這事非常合適,省得我們自己再聲明一個(gè)接口了示例:
using System;using System.Collections.Generic;using System.Text;namespace Example20{class Program{class Class1 : IDisposable{//析構(gòu)函數(shù),編譯后變成 protected void Finalize(),GC會(huì)在回收對(duì)象前會(huì)調(diào)用調(diào)用該方法~Class1(){Dispose(false);}//通過(guò)實(shí)現(xiàn)該接口,客戶(hù)可以顯式地釋放對(duì)象,而不需要等待GC來(lái)釋放資源,據(jù)說(shuō)那樣會(huì)降低效率void IDisposable.Dispose(){Dispose(true);}//將釋放非托管資源設(shè)計(jì)成一個(gè)虛函數(shù),提供在繼承類(lèi)中釋放基類(lèi)的資源的能力protected virtual void ReleaseUnmanageResources(){//Do something...}//私有函數(shù)用以釋放非托管資源private void Dispose(bool disposing){ReleaseUnmanageResources();//為true時(shí)表示是客戶(hù)顯式調(diào)用了釋放函數(shù),需通知GC不要再調(diào)用對(duì)象的Finalize方法//為false時(shí)肯定是GC調(diào)用了對(duì)象的Finalize方法,所以沒(méi)有必要再告訴GC你不要調(diào)用我的Finalize方法啦if (disposing){GC.SuppressFinalize(this);}}}static void Main(string[] args){//tmpObj1沒(méi)有手工釋放資源,就等著GC來(lái)慢慢的釋放它吧Class1 tmpObj1 = new Class1();//tmpObj2調(diào)用了Dispose方法,傳說(shuō)比等著GC來(lái)釋放它效率要調(diào)一些//個(gè)人認(rèn)為是因?yàn)橐饌(gè)對(duì)象的查看其元數(shù)據(jù),以確認(rèn)是否實(shí)現(xiàn)了Dispose方法吧//當(dāng)然最重要的是我們可以自己確定釋放的時(shí)間以節(jié)省內(nèi)存,優(yōu)化程序運(yùn)行效率Class1 tmpObj2 = new Class1();((IDisposable)tmpObj2).Dispose();}}}21.P/Invoke是什么?
答:在受控代碼與非受控代碼進(jìn)行交互時(shí)會(huì)產(chǎn)生一個(gè)事務(wù)(transition) ,這通常發(fā)生在使用平臺(tái)調(diào)用服務(wù)(Platform Invocation Services),即P/Invoke
如調(diào)用系統(tǒng)的 API 或與 COM 對(duì)象打交道,通過(guò) System.Runtime.InteropServices 命名空間
雖然使用 Interop 非常方便,但據(jù)估計(jì)每次調(diào)用事務(wù)都要執(zhí)行 10 到 40 條指令,算起來(lái)開(kāi)銷(xiāo)也不少,所以我們要盡量少調(diào)用事務(wù).如果非用不可,建議本著一次調(diào)用執(zhí)行多個(gè)動(dòng)作,而不是多次調(diào)用每次只執(zhí)行少量動(dòng)作的原則22.StringBuilder 和 String 的區(qū)別?
答:String 在進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)會(huì)產(chǎn)生一個(gè)新的實(shí)例,而 StringBuilder 則不會(huì)。所以在大量字符串拼接或頻繁對(duì)某一字符串進(jìn)行操作時(shí)最好使用 StringBuilder,不要使用 String
另外,對(duì)于 String 我們不得不多說(shuō)幾句:
1.它是引用類(lèi)型,在堆上分配內(nèi)存
2.運(yùn)算時(shí)會(huì)產(chǎn)生一個(gè)新的實(shí)例
3.String 對(duì)象一旦生成不可改變(Immutable)
4.定義相等運(yùn)算符(== 和 !=)是為了比較 String 對(duì)象(而不是引用)的值示例:
using System;using System.Collections.Generic;using System.Text;namespace Example22{class Program{static void Main(string[] args){const int cycle = 10000;long vTickCount = Environment.TickCount;String str = null;for (int i = 0; i < cycle; i++)str += i.ToString();Console.WriteLine("String: {0} MSEL", Environment.TickCount - vTickCount);vTickCount = Environment.TickCount;//看到這個(gè)變量名我就生氣,奇怪為什么大家都使它呢? :)StringBuilder sb = new StringBuilder();for (int i = 0; i < cycle; i++)sb.Append(i);Console.WriteLine("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);string tmpStr1 = "A";string tmpStr2 = tmpStr1;Console.WriteLine(tmpStr1);Console.WriteLine(tmpStr2);//注意后面的輸出結(jié)果,tmpStr1的值改變并未影響到tmpStr2的值tmpStr1 = "B";Console.WriteLine(tmpStr1);Console.WriteLine(tmpStr2);Console.ReadLine();}}}結(jié)果:
String: 375 MSEL
StringBuilder: 16 MSEL
A
A
B
A23.explicit 和 implicit 的含義?
答:explicit 和 implicit 屬于轉(zhuǎn)換運(yùn)算符,如用這兩者可以讓我們自定義的類(lèi)型支持相互交換
explicti 表示顯式轉(zhuǎn)換,如從 A -> B 必須進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換(B = (B)A)
implicit 表示隱式轉(zhuǎn)換,如從 B -> A 只需直接賦值(A = B)
隱式轉(zhuǎn)換可以讓我們的代碼看上去更漂亮、更簡(jiǎn)潔易懂,所以最好多使用 implicit 運(yùn)算符。不過(guò)!如果對(duì)象本身在轉(zhuǎn)換時(shí)會(huì)損失一些信息(如精度),那么我們只能使用 explicit 運(yùn)算符,以便在編譯期就能警告客戶(hù)調(diào)用端示例:
using System;using System.Collections.Generic;using System.Text;namespace Example23{class Program{//本例靈感來(lái)源于大話(huà)西游經(jīng)典臺(tái)詞“神仙?妖怪?”--主要是我實(shí)在想不出什么好例子了class Immortal{public string name;public Immortal(string Name){name = Name;}public static implicit operator Monster(Immortal value){return new Monster(value.name + ":神仙變妖怪?偷偷下凡即可。。。");}}class Monster{public string name;public Monster(string Name){name = Name;}public static explicit operator Immortal(Monster value){return new Immortal(value.name + ":妖怪想當(dāng)神仙?再去修煉五百年!");}}static void Main(string[] args){Immortal tmpImmortal = new Immortal("紫霞仙子");//隱式轉(zhuǎn)換Monster tmpObj1 = tmpImmortal;Console.WriteLine(tmpObj1.name);Monster tmpMonster = new Monster("孫悟空");//顯式轉(zhuǎn)換Immortal tmpObj2 = (Immortal)tmpMonster;Console.WriteLine(tmpObj2.name);Console.ReadLine();}}}結(jié)果:
紫霞仙子:神仙變妖怪?偷偷下凡即可。。。
孫悟空:妖怪想當(dāng)神仙?再去修煉五百年!24.params 有什么用?
答:params 關(guān)鍵字在方法成員的參數(shù)列表中使用,為該方法提供了參數(shù)個(gè)數(shù)可變的能力
它在只能出現(xiàn)一次并且不能在其后再有參數(shù)定義,之前可以示例:
using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{class App{//第一個(gè)參數(shù)必須是整型,但后面的參數(shù)個(gè)數(shù)是可變的。//而且由于定的是object數(shù)組,所有的數(shù)據(jù)類(lèi)型都可以做為參數(shù)傳入public static void UseParams(int id, params object[] list){Console.WriteLine(id);for (int i = 0; i < list.Length; i++){Console.WriteLine(list[i]);}}static void Main(){//可變參數(shù)部分傳入了三個(gè)參數(shù),都是字符串類(lèi)型UseParams(1, "a", "b", "c");//可變參數(shù)部分傳入了四個(gè)參數(shù),分別為字符串、整數(shù)、浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)數(shù)組UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });Console.ReadLine();}}}結(jié)果:
1
a
b
c
2
d
100
33.33
System.Double[]25.什么是反射?
答:反射,Reflection,通過(guò)它我們可以在運(yùn)行時(shí)獲得各種信息,如程序集、模塊、類(lèi)型、字段、屬性、方法和事件
通過(guò)對(duì)類(lèi)型動(dòng)態(tài)實(shí)例化后,還可以對(duì)其執(zhí)行操作
簡(jiǎn)單來(lái)說(shuō)就是用string可以在runtime為所欲為的東西,實(shí)際上就是一個(gè).net framework內(nèi)建的萬(wàn)能工廠
一般用于插件式框架程序和設(shè)計(jì)模式的實(shí)現(xiàn),當(dāng)然反射是一種手段可以充分發(fā)揮其能量來(lái)完成你想做的任何事情(前面好象見(jiàn)過(guò)一位高人用反射調(diào)用一個(gè)官方類(lèi)庫(kù)中未說(shuō)明的函數(shù)。。。)
示例:
using System;using System.Collections.Generic;using System.Text;namespace Example25Lib{public class Class1{private string name;private int age;//如果顯式的聲明了無(wú)參數(shù)構(gòu)造函數(shù),客戶(hù)端只需要用程序集的CreateInstance即可實(shí)例化該類(lèi)//在此特意不實(shí)現(xiàn),以便在客戶(hù)調(diào)用端體現(xiàn)構(gòu)造函數(shù)的反射實(shí)現(xiàn)//public Class1()//{//}public Class1(string Name, int Age){name = Name;age = Age;}public void ChangeName(string NewName){name = NewName;}public void ChangeAge(int NewAge){age = NewAge;}public override string ToString(){return string.Format("Name: {0}, Age: {1}", name, age);}}}反射實(shí)例化對(duì)象并調(diào)用其方法,屬性和事件的反射調(diào)用略去
using System;using System.Collections.Generic;using System.Text;//注意添加該反射的命名空間using System.Reflection;namespace Example25{class Program{static void Main(string[] args){//加載程序集Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");//遍歷程序集內(nèi)所有的類(lèi)型,并實(shí)例化Type[] tmpTypes = tmpAss.GetTypes();foreach (Type tmpType in tmpTypes){//獲取第一個(gè)類(lèi)型的構(gòu)造函數(shù)信息ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();foreach (ConstructorInfo tmpConsInfo in tmpConsInfos){//為構(gòu)造函數(shù)生成調(diào)用的參數(shù)集合ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();object[] tmpParams = new object[tmpParamInfos.Length];for (int i = 0; i < tmpParamInfos.Length; i++){tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);if (tmpParamInfos[i].ParameterType.FullName == "System.String"){tmpParams[i] = "Clark";}}//實(shí)例化對(duì)象object tmpObj = tmpConsInfo.Invoke(tmpParams);Console.WriteLine(tmpObj);//獲取所有方法并執(zhí)行foreach (MethodInfo tmpMethod in tmpType.GetMethods()){//為方法的調(diào)用創(chuàng)建參數(shù)集合tmpParamInfos = tmpMethod.GetParameters();tmpParams = new object[tmpParamInfos.Length];for (int i = 0; i < tmpParamInfos.Length; i++){tmpParams[i] = tmpAss.CreateInstance
(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName == "System.String"){tmpParams[i] = "Clark Zheng";}if (tmpParamInfos[i].ParameterType.FullName == "System.Int32"){tmpParams[i] = 27;}}tmpMethod.Invoke(tmpObj, tmpParams);}//調(diào)用完方法后再次打印對(duì)象,比較結(jié)果Console.WriteLine(tmpObj);}}Console.ReadLine();}}}結(jié)果:
Name: Clark, Age: 0
Name: Clark Zheng, Age: 27
總結(jié):通過(guò)以上我們可以理解C#中難以理解的概念和示例代碼.
軟件測(cè)試題目
一、 判斷題 (每題2分,20)1、軟件測(cè)試就是為了驗(yàn)證軟件功能實(shí)現(xiàn)的是否正確,是否完成既定目標(biāo)的活動(dòng),所以軟件測(cè)試在軟件工程的后期才開(kāi)始具體的工作。 (初級(jí)) ( × )
2、發(fā)現(xiàn)錯(cuò)誤多的模塊,殘留在模塊中的錯(cuò)誤也多。( √ ) (初級(jí))
3、測(cè)試人員在測(cè)試過(guò)程中發(fā)現(xiàn)一處問(wèn)題,如果問(wèn)題影響不大,而自己又可以修改,應(yīng)立即將此問(wèn)題正確修改,以加快、提高開(kāi)發(fā)的進(jìn)程。( × )(初級(jí))
4、單元測(cè)試通常應(yīng)該先進(jìn)行“人工走查”,再以白盒法為主,輔以黑盒法進(jìn)行動(dòng)態(tài)測(cè)試。
( √ )(中級(jí))
5、功能測(cè)試是系統(tǒng)測(cè)試的主要內(nèi)容,檢查系統(tǒng)的功能、性能是否與需求規(guī)格說(shuō)明相同。( √ )(中級(jí))
6、軟件質(zhì)量管理即QM由QA和QC構(gòu)成,軟件測(cè)試屬于QC的核心工作內(nèi)容。(√)(高級(jí))
7、軟件測(cè)試只能發(fā)現(xiàn)錯(cuò)誤,但不能保證測(cè)試后的軟件沒(méi)有錯(cuò)誤。(√)
8、軟件就是程序。(X)
9、測(cè)試只要做到語(yǔ)句覆蓋和分支覆蓋,就可以發(fā)現(xiàn)程序中的所有錯(cuò)誤。(X)
10、I18N測(cè)試是指對(duì)產(chǎn)品做出具有國(guó)際性的規(guī)劃,而L10N測(cè)試則是指對(duì)軟件做出符合本地需求更改工作。(√)【高級(jí)】
.NET工程(三)
1.面向?qū)ο蟮乃枷胫饕ㄊ裁矗?/span>
繼承多態(tài)封裝
●封裝:用抽象的數(shù)據(jù)類(lèi)型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在抽象數(shù)據(jù)類(lèi)型內(nèi)部。
●繼承:子類(lèi)擁有父類(lèi)的所有數(shù)據(jù)和操作。
●多態(tài):一個(gè)程序中同名的不同方法共存的情況。
有兩種形式的多態(tài)–重載與重寫(xiě)。
2.什么是ASP.net中的用戶(hù)控件
用戶(hù)控件就是.ascx擴(kuò)展名的東西嘍,可以拖到不同的頁(yè)面中調(diào)用,以節(jié)省代碼.比如登陸可能在多個(gè)頁(yè)面上有,就可以做成用戶(hù)控件,但是有一個(gè)問(wèn)題就是用戶(hù)控件拖到不同級(jí)別的目錄下后里面的圖片等的相對(duì)路徑會(huì)變得不準(zhǔn)確,需要自已寫(xiě)方法調(diào)整.
問(wèn)這樣的問(wèn)題,一般是迷惑你.因?yàn)樾率诌是分不清楚用戶(hù)控件和服務(wù)器控件(也稱(chēng)自定義控件)..用戶(hù)控件一般用在內(nèi)容多為靜態(tài),或者少許會(huì)改變的情況下..用的比較大..類(lèi)似ASP中的include..但是功能要強(qiáng)大的多..
在C#中,string str = null 與 string str = “”的區(qū)別。
答:string str = null 是不給他分配內(nèi)存空間,而string str = "" 給它分配長(zhǎng)度為空字符串的內(nèi)存空間
請(qǐng)?jiān)斒鲈?/span>dotnet中類(lèi)(class)與結(jié)構(gòu)(struct)的異同
Class可以被實(shí)例化,屬于引用類(lèi)型,是分配在內(nèi)存的堆上的,Struct屬于值類(lèi)型,是分配在內(nèi)存的棧上的.DataReader和DataSet的異同
DataReader和DataSet最大的區(qū)別在于,DataReader使用時(shí)始終占用SqlConnection,在線(xiàn)操作數(shù)據(jù)庫(kù)..任何對(duì)SqlConnection的操作都會(huì)引發(fā)DataReader的異常..因?yàn)镈ataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的..因?yàn)镈ataReader的特殊性和高性能.所以DataReader是只進(jìn)的..你讀了第一條后就不能再去讀取第一條了..
DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中.拋棄數(shù)據(jù)庫(kù)連接..讀取完畢即放棄數(shù)據(jù)庫(kù)連接..因?yàn)镈ataSet將數(shù)據(jù)全部加載在內(nèi)存中.所以比較消耗內(nèi)存...但是確比DataReader要靈活..可以動(dòng)態(tài)的添加行,列,數(shù)據(jù).對(duì)數(shù)據(jù)庫(kù)進(jìn)行回傳更新操作.8.C#中的接口和類(lèi)有什么異同。
接口和類(lèi)都是類(lèi),不同的事,接口只包含方法或?qū)傩缘穆暶,不包含具體實(shí)現(xiàn)方法的代碼,接口可以實(shí)現(xiàn)多繼承,而類(lèi)只能是單繼承,繼承接口的類(lèi)必須實(shí)現(xiàn)接口中聲明的方法或?qū)傩。接口主要定義一種規(guī)范,統(tǒng)一調(diào)用方法,在大型項(xiàng)目中接口正發(fā)揮日益重要的作用
類(lèi)是方法功能的實(shí)現(xiàn)和集合,接口是規(guī)范類(lèi).約束類(lèi).
接口,是可以多繼承,類(lèi)只有單繼承.接口強(qiáng)調(diào)了你必須實(shí)現(xiàn),而沒(méi)有具本實(shí)現(xiàn)的方法和虛類(lèi)有點(diǎn)相似Override與重載有什么區(qū)別?
一個(gè)是重寫(xiě)父類(lèi)函數(shù),一個(gè)是同一個(gè)函數(shù)的幾種形式觸發(fā)器的作用
觸發(fā)器可以查詢(xún)其它表,而且可以包含復(fù)雜的 SQL 語(yǔ)句。它們主要用于強(qiáng)制復(fù)雜的業(yè)務(wù)規(guī)則或要求。觸發(fā)器還有助于強(qiáng)制引用完整性,以便在添加、更新或刪除表中的行時(shí)保留表之間已定義的關(guān)系。
保證數(shù)據(jù)庫(kù)操作變更能接到通知<%# %> 和 <% %> 有什么區(qū)別?
<%# %>表示綁定的數(shù)據(jù)源
<% %>是服務(wù)器端代碼塊常見(jiàn)的設(shè)計(jì)模式
抽象工廠模式、適配器模式、外觀模式 command命令模式,橋接模式,組合模式,裝飾模式,狀態(tài)模式,備忘錄模式等。
??軟件設(shè)計(jì)模式太多,就我的理解簡(jiǎn)單說(shuō)一下最常見(jiàn)的MVC模式。
??MVC模式是1996年由Buschmann提出的:
??模型(Model):就是封裝數(shù)據(jù)和所有基于對(duì)這些數(shù)據(jù)的操作。
??視圖(View):就是封裝的是對(duì)數(shù)據(jù)顯示,即用戶(hù)界面。
??控制器(Control):就是封裝外界作用于模型的操作和對(duì)數(shù)據(jù)流向的控制等。??
3.什么叫應(yīng)用程序域?什么是受管制的代碼?什么是強(qiáng)類(lèi)型系統(tǒng)?什么是裝箱和拆箱?什么是重載?CTS、CLS和CLR分別作何解釋?zhuān)?/span>
4.列舉一下你所了解的XML技術(shù)及其應(yīng)用
5.值類(lèi)型和引用類(lèi)型的區(qū)別?寫(xiě)出C#的樣例代碼。
在dotnet中有兩大類(lèi)數(shù)據(jù)類(lèi)型,即值類(lèi)型和引用類(lèi)型,值類(lèi)型存貯在棧中,而引用類(lèi)型存貯在動(dòng)態(tài)的堆中,棧是先進(jìn)先出的有系統(tǒng)管理的空間,而堆是由應(yīng)用程序控制的可隨時(shí)申請(qǐng)和釋放該空間,在Donnet中一般情況下有垃圾收集器處理,他們的不同導(dǎo)致在編程上的不同。
例: StringBuilder a=new StringBuilder();//將StringBuilder的一個(gè)首地址傳給a
StringBuilder b=a;//將StringBuilder的一個(gè)首地址傳給b
b.Append("mxh");
Console.WriteLine(a);
a=null;
Console.WriteLine(b);
輸出結(jié)果:mxh
mxh
"a=null"的意思是:a的引用置為空但此時(shí)StringBuilder的堆空間并沒(méi)有被釋放,因此在此之后,輸出b時(shí),仍然可以輸出mxh
6.ADO.net中常用的對(duì)象有哪些?分別描述一下。
7.如何理解委托?
C# 中的委托類(lèi)似于 C 或 C++ 中的函數(shù)指針。使用委托使程序員可以將方法引用封裝在委托對(duì)象內(nèi)。然后可以將該委托對(duì)象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時(shí)知道將調(diào)用哪個(gè)方法。與 C 或 C++ 中的函數(shù)指針不同,委托是面向?qū)ο、?lèi)型安全的,并且是安全的。
9.。net中讀寫(xiě)數(shù)據(jù)庫(kù)需要用到哪些類(lèi)?他們的作用
10.UDP連接和TCP連接的異同。
11.ASP.net的身份驗(yàn)證方式有哪些?分別是什么原理?
window驗(yàn)證:為每個(gè)用戶(hù)開(kāi)啟window帳號(hào),驗(yàn)證其身份.安全性較高.
forms驗(yàn)證:為每個(gè)登陸用戶(hù)寫(xiě)入一個(gè)身份驗(yàn)證票據(jù)..在web使用最廣的驗(yàn)證方式..靈活方便.
12.進(jìn)程和線(xiàn)程分別怎么理解?
13.什么是code-Behind技術(shù)。
新建一個(gè)VS.NET下的項(xiàng)目..看到ASPX,RESX和CS三個(gè)后綴的文件了嗎??這個(gè)就是代碼分離.實(shí)現(xiàn)了HTML代碼和服務(wù)器代碼分離.方便代碼編寫(xiě)和整理.
14.活動(dòng)目錄的作用。
活動(dòng)目錄是window2000的最重要的功能.可以將用戶(hù)信息全部集成起來(lái),登陸以后可以訪(fǎng)問(wèn)多個(gè)不同的網(wǎng)絡(luò)服務(wù)..
.
15..net中讀寫(xiě)XML的類(lèi)都?xì)w屬于哪些命名空間?
System.XML類(lèi)
16.解釋一下UDDI、WSDL的意義及其作用。
17.什么是SOAP,有哪些應(yīng)用。
simple object access protocal,簡(jiǎn)單對(duì)象接受協(xié)議.以xml為基本編碼結(jié)構(gòu),建立在已有通信協(xié)議上(如http,不過(guò)據(jù)說(shuō)ms在搞最底層的架構(gòu)在tcp/ip上的soap)的一種規(guī)范
是微軟大力推廣的Web Service使用的協(xié)議..
18.如何部署一個(gè)ASP.net頁(yè)面。
19.如何理解.net中的垃圾回收機(jī)制。
如果發(fā)現(xiàn)內(nèi)存不夠,則垃圾回收器,將全部對(duì)象作為無(wú)效對(duì)象(被回收對(duì)象),然后先將全局變量,static,處于活動(dòng)中的局部變量,以及當(dāng)前CG指針指向的對(duì)象放入一個(gè)表中.然后
會(huì)搜索新列表中的對(duì)象所引用的對(duì)象.加入列表中,其他沒(méi)有被加入列表的對(duì)象都會(huì)被回收.
20.常用的調(diào)用webservice方法有哪些?
我一般用的是WSDL..或者web引用..
21列舉一下你所了解的XML技術(shù)及其應(yīng)用
.xml可以用來(lái)做網(wǎng)頁(yè)(xslt) xml可以當(dāng)作數(shù)據(jù)庫(kù) xml可以用來(lái)保存對(duì)象的系列化
xml用于配置,用于保存靜態(tài)數(shù)據(jù)類(lèi)型.接觸XML最多的是web Services..和config
C#中 property 與 attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?
一個(gè)是屬性,用于存取類(lèi)的字段,一個(gè)是特性,用來(lái)標(biāo)識(shí)類(lèi),方法等的附加性質(zhì)
C#可否對(duì)內(nèi)存進(jìn)行直接的操作?
可以維護(hù)數(shù)據(jù)庫(kù)的完整性、一致性、你喜歡用觸發(fā)器還是自寫(xiě)業(yè)務(wù)邏輯?為什么
觸發(fā)器,性能好,事務(wù)性
ADO。NET相對(duì)于ADO等主要有什么改進(jìn)?
新增dataset等,不需要隨時(shí)保持連接,性能提高
ASP。NET與ASP相比,主要有哪些進(jìn)步?
asp解釋型,aspx編譯型,性能提高,有利于保護(hù)源碼
C#中的委托是什么?事件是不是一種委托?
委托是一種安全的函數(shù)指針,事件是一種消息機(jī)制
你對(duì)XMLHTTP、WEBSERVICE 了解嗎?簡(jiǎn)單描述其特點(diǎn)、作用
xmlhttp可以主動(dòng)獲取遠(yuǎn)端web代碼,類(lèi)似HttpWebRequest接口和抽象類(lèi)有什么區(qū)別?你選擇使用接口和抽象類(lèi)的依據(jù)是什么?
接口用于規(guī)范,抽象類(lèi)用于共性。存儲(chǔ)過(guò)程和函數(shù)的區(qū)別
存儲(chǔ)過(guò)程是編譯好的存儲(chǔ)在數(shù)據(jù)庫(kù)的操作,函數(shù)不用說(shuō)了.事務(wù)是什么?
具有原子性特點(diǎn)游標(biāo)的作用?如何知道游標(biāo)已經(jīng)到了最后?
指示當(dāng)前記錄的位置,檢查NULL觸發(fā)器分為事前觸發(fā)和事后觸發(fā),這兩種觸發(fā)有和區(qū)別。語(yǔ)句級(jí)觸發(fā)和行級(jí)觸發(fā)有何區(qū)別。
一個(gè)是操作前,一個(gè)是操作后請(qǐng)說(shuō)明在.net中常用的幾種頁(yè)面間傳遞參數(shù)的方法,并說(shuō)出他們的優(yōu)缺點(diǎn)。
session(viewstate) 簡(jiǎn)單,但易丟失
application 全局
cookie 簡(jiǎn)單,但可能不支持,可能被偽造
input type="hidden" 簡(jiǎn)單,可能被偽造
url參數(shù) 簡(jiǎn)單,顯示于地址欄,長(zhǎng)度有限
數(shù)據(jù)庫(kù) 穩(wěn)定,安全,但性能相對(duì)弱請(qǐng)說(shuō)明.net中的錯(cuò)誤處理機(jī)制,并舉例
try catch final請(qǐng)說(shuō)出強(qiáng)名的含義
具有自己的key,可以在GAC為公用請(qǐng)列出c#中幾種循環(huán)的方法,并指出他們的不同
for wile foreach請(qǐng)指出.net中所有類(lèi)型的基類(lèi)
object請(qǐng)指出GAC的含義
全局程序集緩存值類(lèi)型與引用類(lèi)型有什么區(qū)別?
值和指針的區(qū)別怎樣理解靜態(tài)變量?
所有實(shí)例公用一個(gè)的變量向服務(wù)器發(fā)送請(qǐng)求有幾種方式?
get post如果在一個(gè)B/S結(jié)構(gòu)的系統(tǒng)中需要傳遞變量值,但是又不能使用Session、Cookie、Application,您有幾種方法進(jìn)行處理?
input type=""
url
數(shù)據(jù)庫(kù)用.net做B/S結(jié)構(gòu)的系統(tǒng),您是用幾層結(jié)構(gòu)來(lái)開(kāi)發(fā),每一層之間的關(guān)系以及為什么要這樣分層?
三層,表現(xiàn),邏輯,數(shù)據(jù), 安全性,維護(hù)性軟件開(kāi)發(fā)過(guò)程一般有幾個(gè)階段?每個(gè)階段的作用?
需求分析,架構(gòu)設(shè)計(jì),代碼編寫(xiě),QA,部署通過(guò)超鏈接怎樣傳遞中文參數(shù)?
URLEncode URLDecode請(qǐng)編程遍歷頁(yè)面上所有TextBox控件并給它賦值為string.Empty
foreach有哪幾種方法可以實(shí)現(xiàn)一個(gè)類(lèi)存取另外一個(gè)類(lèi)的成員函數(shù)及屬性,并請(qǐng)舉列來(lái)加以說(shuō)明和分析.
同一個(gè)名稱(chēng)控件直接,或者反射如果需記錄類(lèi)的實(shí)例個(gè)數(shù),該如何實(shí)現(xiàn),請(qǐng)寫(xiě)一個(gè)簡(jiǎn)單的類(lèi)于以證明.
const static int classNum=0;
classNum++;A類(lèi)是B類(lèi)的基類(lèi),并且都有自己的構(gòu)造,析構(gòu)函數(shù),請(qǐng)舉例證明B類(lèi)從實(shí)例化到消亡過(guò)程中構(gòu)造,析構(gòu)函數(shù)的執(zhí)行過(guò)程.
構(gòu)造先父后子,析夠反之需要實(shí)現(xiàn)對(duì)一個(gè)字符串的處理,首先將該字符串首尾的空格去掉,如果字符串中間還有連續(xù)空格的話(huà),僅保留一個(gè)空格,即允許字符串中間有多個(gè)空格,但連續(xù)的空格數(shù)不可超過(guò)一個(gè).
string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");在c#中using和new這兩個(gè)關(guān)鍵字有什么意義,請(qǐng)寫(xiě)出你所知道的意義?
using 指令 和語(yǔ)句 new 創(chuàng)建實(shí)例 new 隱藏基類(lèi)中方法
using 引入名稱(chēng)空間或者使用非托管資源
new 新建實(shí)例或者隱藏父類(lèi)方法談?wù)勵(lì)惡徒Y(jié)構(gòu)的區(qū)別?
類(lèi)是引用類(lèi)型、結(jié)構(gòu)是值類(lèi)型什么叫做SQL注入,如何防止?請(qǐng)舉例說(shuō)明。
利用sql關(guān)鍵字對(duì)網(wǎng)站進(jìn)行攻擊。過(guò)濾關(guān)鍵字'等下面這段代碼輸出什么?為什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");寫(xiě)一個(gè)實(shí)現(xiàn)對(duì)一段字符串翻轉(zhuǎn)的方法,附加一些條件,如其中包括“,”、“.”,對(duì)其設(shè)計(jì)測(cè)試用例
inputStr=inputStr.ToCharArray().Reverse().ToString();什么是反射?
動(dòng)態(tài)獲取程序集信息用Singleton如何寫(xiě)設(shè)計(jì)模式
static屬性里面new ,構(gòu)造函數(shù)privateC#中的垃圾回收機(jī)制是怎樣的?
三個(gè)generation,當(dāng)每個(gè)generation內(nèi)存滿(mǎn)了的時(shí)候檢查引用,無(wú)引用就回收內(nèi)存什么是Application Pool?
Web應(yīng)用,類(lèi)似Thread Pool,提高并發(fā)性能鏈表和數(shù)組的區(qū)別,各有什么優(yōu)缺點(diǎn).
一個(gè)可以動(dòng)態(tài)增長(zhǎng),一個(gè)固定(VB中可以Redim),性能數(shù)組教好什么是友元函數(shù)?
friendly聲明,可以訪(fǎng)問(wèn)protect級(jí)別方法什么是虛函數(shù)?
可以被重寫(xiě)什么是抽象函數(shù)?
必須被重寫(xiě)什么是內(nèi)存泄漏,怎樣最簡(jiǎn)單的方法判斷被存泄漏 ?
C++,C中忘了釋放內(nèi)存,內(nèi)存不會(huì)再次分配1SQL Server的兩種索引是何形式?索引的作用?索引的優(yōu)缺點(diǎn)?
cluster和非cluster,加速查找,占用額外控件,維護(hù)索引耗費(fèi)時(shí)間什么是XML?
可擴(kuò)展標(biāo)記語(yǔ)言,可以做配置文件,可以傳輸數(shù)據(jù),可以存儲(chǔ)數(shù)據(jù)簡(jiǎn)述 private、 protected、 public、 internal 修飾符的訪(fǎng)問(wèn)權(quán)限。
private : 私有成員, 在類(lèi)的內(nèi)部才可以訪(fǎng)問(wèn)。
protected : 保護(hù)成員,該類(lèi)內(nèi)部和繼承類(lèi)中可以訪(fǎng)問(wèn)。
public : 公共成員,完全公開(kāi),沒(méi)有訪(fǎng)問(wèn)限制。
internal: 在同一命名空間內(nèi)可以訪(fǎng)問(wèn)。進(jìn)程和線(xiàn)程的區(qū)別
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位;線(xiàn)程是CPU調(diào)度和分派的單位,一個(gè)進(jìn)程可以有多個(gè)線(xiàn)程,這些線(xiàn)程共享這個(gè)進(jìn)程的資源。
成員變量和成員函數(shù)前加static的作用
它們被稱(chēng)為常成員變量和常成員函數(shù),又稱(chēng)為類(lèi)成員變量和類(lèi)成員函數(shù)。分別用來(lái)反映類(lèi)的狀態(tài)。比如類(lèi)成員變量可以用來(lái)統(tǒng)計(jì)類(lèi)實(shí)例的數(shù)量,類(lèi)成員函數(shù)負(fù)責(zé)這種統(tǒng)計(jì)的動(dòng)作。
malloc和new的區(qū)別
new是C++的關(guān)鍵字。malloc在分配內(nèi)存時(shí)必須按給出的字節(jié)分配,new可以按照對(duì)象的大小自動(dòng)分配,并且能調(diào)用構(gòu)造函數(shù)?梢哉f(shuō)new是對(duì)象的對(duì)象,而malloc不是。本質(zhì)上new分配內(nèi)存時(shí),還會(huì)在實(shí)際內(nèi)存塊的前后加上附加信息,所以new所使用的內(nèi)存大小比malloc多。
堆和棧的區(qū)別
棧:由編譯器自動(dòng)分配、釋放。在函數(shù)體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內(nèi)存函數(shù)分配得到的就是在堆上。
棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),而堆則是C/C++函數(shù)庫(kù)提供的。
棧是系統(tǒng)提供的功能,特點(diǎn)是快速高效,缺點(diǎn)是有限制,數(shù)據(jù)不靈活;而棧是函數(shù)庫(kù)提供的功能,特點(diǎn)是靈活方便,數(shù)據(jù)適應(yīng)面廣泛,但是效率有一定降低。棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對(duì)于進(jìn)程/線(xiàn)程是唯一的;堆是函數(shù)庫(kù)內(nèi)部數(shù)據(jù)結(jié)構(gòu),不一定唯一。不同堆分配的內(nèi)存無(wú)法互相操作。?臻g分靜態(tài)分配和動(dòng)態(tài)分配兩種。靜態(tài)分配是編譯器完成的,比如自動(dòng)變量(auto)的分配。動(dòng)態(tài)分配由alloca函數(shù)完成。棧的動(dòng)態(tài)分配無(wú)需釋放(是自動(dòng)的),也就沒(méi)有釋放函數(shù)。為可移植的程序起見(jiàn),棧的動(dòng)態(tài)分配操作是不被鼓勵(lì)的!堆空間的分配總是動(dòng)態(tài)的,雖然程序結(jié)束時(shí)所有的數(shù)據(jù)空間都會(huì)被釋放回系統(tǒng),但是精確的申請(qǐng)內(nèi)存/釋放內(nèi)存匹配是良好程序的基本要素。在.Net中,類(lèi)System.Web.UI.Page 可以被繼承么?
可以你覺(jué)得ASP.NET 2.0(VS2005)和你以前使用的開(kāi)發(fā)工具(.Net 1.0或其他)有什么最大的區(qū)別?你在以前的平臺(tái)上使用的哪些開(kāi)發(fā)思想(pattern / architecture)可
1 ASP.NET 2.0 把一些代碼進(jìn)行了封裝打包,所以相比1.0相同功能減少了很多代碼.
2 同時(shí)支持代碼分離和頁(yè)面嵌入服務(wù)器端代碼兩種模式,以前1.0版本,.NET提示幫助只有在分離的代碼文件,無(wú)法在頁(yè)面嵌入服務(wù)器端代碼獲得幫助提示,
3 代碼和設(shè)計(jì)界面切換的時(shí)候,2.0支持光標(biāo)定位.這個(gè)我比較喜歡
4 在綁定數(shù)據(jù),做表的分頁(yè).UPDATE,DELETE,等操作都可以可視化操作,方便了初學(xué)者
5, 在ASP.NET中增加了40多個(gè)新的控件,減少了工作量.net的錯(cuò)誤處理機(jī)制是什么
.net錯(cuò)誤處理機(jī)制采用try->catch->finally結(jié)構(gòu),發(fā)生錯(cuò)誤時(shí),層層上拋,直到找到匹配的Catch為止。重載與覆蓋的區(qū)別
1、方法的覆蓋是子類(lèi)和父類(lèi)之間的關(guān)系,是垂直關(guān)系;方法的重載是同一個(gè)類(lèi)中方法之間的關(guān)系,是水平關(guān)系。
2、覆蓋只能由一個(gè)方法,或只能由一對(duì)方法產(chǎn)生關(guān)系;方法的重載是多個(gè)方法之間的關(guān)系。
3、覆蓋要求參數(shù)列表相同;重載要求參數(shù)列表不同。
4、覆蓋關(guān)系中,調(diào)用那個(gè)方法體,是根據(jù)對(duì)象的類(lèi)型(對(duì)象對(duì)應(yīng)存儲(chǔ)空間類(lèi)型)來(lái)決定;重載關(guān)系,是根據(jù)調(diào)用時(shí)的實(shí)參表與形參表來(lái)選擇方法體的。簡(jiǎn)要談一下您對(duì)微軟.NET 構(gòu)架下remoting和webservice兩項(xiàng)技術(shù)的理解以及實(shí)際中的應(yīng)用。
WS主要是可利用HTTP,穿透防火墻。而Remoting可以利用TCP/IP,二進(jìn)制傳送提高效率。C#中的委托是什么?事件是不是一種委托?
委托是一種安全的函數(shù)指針,事件是一種消息機(jī)制new有幾種用法
第一種:new Class();
第二種:覆蓋方法
public new XXXX(){}
第三種:new 約束指定泛型類(lèi)聲明中的任何類(lèi)型參數(shù)都必須有公共的無(wú)參數(shù)構(gòu)造函數(shù)。
如何把一個(gè)array復(fù)制到arrayList里
foreach( object o in array )arrayList.Add(o);
datagrid.datasouse可以連接什么數(shù)據(jù)源
dataset,datatable,dataview , IList
概述反射和序列化
反射:程序集包含模塊,而模塊包含類(lèi)型,類(lèi)型又包含成員。反射則提供了封裝程序集、模塊和類(lèi)型的對(duì)象。您可以使用反射動(dòng)態(tài)地創(chuàng)建類(lèi)型的實(shí)例,將類(lèi)型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類(lèi)型。然后,可以調(diào)用類(lèi)型的方法或訪(fǎng)問(wèn)其字段和屬性
序列化:序列化是將對(duì)象轉(zhuǎn)換為容易傳輸?shù)母袷降倪^(guò)程。例如,可以序列化一個(gè)對(duì)象,然后使用 HTTP 通過(guò) Internet 在客戶(hù)端和服務(wù)器之間傳輸該對(duì)象。在另一端,反序列化將從該流重新構(gòu)造對(duì)象。
概述o/r mapping 的原理>
利用反射,配置 將類(lèi)于數(shù)據(jù)庫(kù)表映射
用sealed修飾的類(lèi)有什么特點(diǎn)
sealed 修飾符用于防止從所修飾的類(lèi)派生出其它類(lèi)。如果一個(gè)密封類(lèi)被指定為其他類(lèi)的基類(lèi),則會(huì)發(fā)生編譯時(shí)錯(cuò)誤。
密封類(lèi)不能同時(shí)為抽象類(lèi)。
sealed 修飾符主要用于防止非有意的派生,但是它還能促使某些運(yùn)行時(shí)優(yōu)化。具體說(shuō)來(lái),由于密封類(lèi)永遠(yuǎn)不會(huì)有任何派生類(lèi),所以對(duì)密封類(lèi)的實(shí)例的虛擬函數(shù)成員的調(diào)用可以轉(zhuǎn)換為非虛擬調(diào)用來(lái)處理。
什么叫應(yīng)用程序域?什么是受管制的代碼?什么是強(qiáng)類(lèi)型系統(tǒng)?什么是裝箱和拆箱?什么是重載?CTS、CLS和CLR分別作何解釋?
答:裝箱就是把值類(lèi)型轉(zhuǎn)成引用類(lèi)型,從MS IL角度看好像是boxing,沒(méi)記錯(cuò)的話(huà)是把值從堆棧轉(zhuǎn)到堆中.拆箱相反,重載就是指一個(gè)方法名同,參數(shù)個(gè)數(shù)不同,返回值可以相同的方法.CLR是通用語(yǔ)言運(yùn)行時(shí),其它的不清楚.
如何理解委托?
答:據(jù)說(shuō)相當(dāng)于函數(shù)指針,定義了委托就可以在不調(diào)用原方法名稱(chēng)的情況下調(diào)用那個(gè)方法.
委托具有以下特點(diǎn):
委托類(lèi)似于 C++ 函數(shù)指針,但它是類(lèi)型安全的。
委托允許將方法作為參數(shù)進(jìn)行傳遞。
委托可用于定義回調(diào)方法。
委托可以鏈接在一起;例如,可以對(duì)一個(gè)事件調(diào)用多個(gè)方法。
方法不需要與委托簽名精確匹配。有關(guān)更多信息,請(qǐng)參見(jiàn)協(xié)變和逆變。
C# 2.0 版引入了匿名方法的概念,此類(lèi)方法允許將代碼塊作為參數(shù)傳遞,以代替單獨(dú)定義的方法。
UDP連接和TCP連接的異同。
前者只管傳,不管數(shù)據(jù)到不到,無(wú)須建立連接.后者保證傳輸?shù)臄?shù)據(jù)準(zhǔn)確,須要連結(jié).
進(jìn)程和線(xiàn)程分別怎么理解?
進(jìn)程是老子,線(xiàn)程是兒子,沒(méi)有老子就沒(méi)有兒子,一個(gè)老子可以有多個(gè)兒子.一個(gè)兒子可以成為別人的兒子,一個(gè)老子也可以為別的老子生兒子.
什么是SOAP,有哪些應(yīng)用。
答:SOAP(Simple Object Access Protocol )簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議是在分散或分布式的環(huán)境中交換信息并執(zhí)行遠(yuǎn)程過(guò)程調(diào)用的協(xié)議,是一個(gè)基于XML的協(xié)議。使用SOAP,不用考慮任何特定的傳輸協(xié)議(最常用的還是HTTP協(xié)議),可以允許任何類(lèi)型的對(duì)象或代碼,在任何平臺(tái)上,以任何一直語(yǔ)言相互通信。這種相互通信采用的是XML格式的消息.1. 填空: (1)面向?qū)ο蟮恼Z(yǔ)言具有___繼承性、封裝性、多態(tài)性。
(2)能用foreach遍歷訪(fǎng)問(wèn)的對(duì)象需要實(shí)現(xiàn) IEnumerable接口或聲明GetEnumerator 方法的類(lèi)型
(3)列舉ADO.net中的五個(gè)主要對(duì)象
Command、Connection、DataSet、DataAdapter、DataReader。
2. 不定項(xiàng)選擇:
(1) 以下敘述正確的是:
A. 接口中可以有虛方法。 B. 一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口。
C. 接口不能被實(shí)例化。 D. 接口中可以包含已實(shí)現(xiàn)的方法。
(2) 從數(shù)據(jù)庫(kù)讀取記錄,你可能用到的方法有:
A. ExecuteNonQuery B. ExecuteScalar
C. Fill D. ExecuteReader
3. 簡(jiǎn)述 private、 protected、 public、 internal 修飾符的訪(fǎng)問(wèn)權(quán)限。
4. 寫(xiě)出一條Sql語(yǔ)句:取出表A中第31到第40記錄(SQLServer, 以自動(dòng)增長(zhǎng)的ID作為主鍵, 注意:ID
可能不是連續(xù)的。)
5 .列舉ASP.NET 頁(yè)面之間傳遞值的幾種方式。
三種比較常見(jiàn)的方式,一種是可以通過(guò)用QueryString來(lái)傳送相應(yīng)的值,再一種是通過(guò)session變量來(lái)傳送相應(yīng)的值,還有就是通過(guò)Server.Transfer方法來(lái)實(shí)現(xiàn)
(1)queryString
(2)session
(3)cookie
(4)server.transfer
(5)hidden control/view state
(6)static member.
(7)cache
(8)application
(9)DataBase
(10)xml or other Files
(11)XMLHTTP or Hidden iFrame/frame
(12)Context.user.identity
我正在做一個(gè)通用提示葉面,所有葉面出現(xiàn)問(wèn)題都要,傳遞幾個(gè)變量字符串到同一個(gè)葉面 hitMsg.aspx 變量字符串包括提示語(yǔ)言,即將跳轉(zhuǎn)的葉面,跳轉(zhuǎn)時(shí)間。在1-11種方案中哪個(gè)更好些?
(1)queryString的毛病是無(wú)法傳遞很長(zhǎng)字符串,比如系統(tǒng)錯(cuò)誤信息往往就一整個(gè)屏幕。
(2)session的毛病是不能過(guò)多使用,依賴(lài)Cookie,容易丟失。
(3)cookie的毛病是依賴(lài)客戶(hù)端設(shè)置,不可靠。
(4)server.transfer的毛病是接收葉面要為發(fā)送葉面準(zhǔn)備好,只能定制專(zhuān)門(mén)一個(gè)葉面接受定制好的葉面。
不能是一個(gè)葉面接受任何葉面。
(5)hidden control/view state只能傳遞本頁(yè)。除非特殊制作。
(6)static member.無(wú)法保證線(xiàn)程安全,可能會(huì)此處栽瓜他處得豆。
(7)cache不適合使用一次就扔的變量。
(8)application全局的,開(kāi)銷(xiāo)大。
(9)DataBase全局固化的,開(kāi)銷(xiāo)更大,除非做日志跟蹤。
(10)xml or other Files全局固化的,開(kāi)銷(xiāo)大,除非做日志跟蹤。
(11)XMLHTTP or Hidden iFrame/frame,做這個(gè)過(guò)于煩瑣。
(12)Context這個(gè)占用了用戶(hù)id,不適合做這個(gè)。
6. 寫(xiě)出程序的輸出結(jié)果
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);
}
}
7.寫(xiě)出程序的輸出結(jié)果
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();
}
}
8. 寫(xiě)出程序的輸出結(jié)果:
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);
}
}
9. 一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34......
求第30位數(shù)是多少,用遞歸算法實(shí)現(xiàn)。(C#語(yǔ)言)
-------------------------------------------
a0 = 0,a1 = 1,An = An-1 + An-2(n>=2)
int[] iArray = new int[31];
iArray[0] = 0;
iArray[1] = 1;
for (int i = 2; i <= 30; i++)
{
iArray[i] = iArray[i - 1] + iArray[i - 2];
}
---------------參考答案二---------------------------------int i=0,ii=1,s=1,num=0;
while(num<=30)
{
s=i+ii;
Response.Write(i+"+"+ii+"="+s+"<br>");
if(s==1)
{
i=1;
}
else
{
i=s-i;
}
ii=s;
num++;
}========================
10. 程序設(shè)計(jì): 貓大叫一聲,所有的老鼠都開(kāi)始逃跑,主人被驚醒。(C#語(yǔ)言)
要求: 1.要有聯(lián)動(dòng)性,老鼠和主人的行為是被動(dòng)的。
2.考慮可擴(kuò)展性,貓的叫聲可能引起其他聯(lián)動(dòng)效應(yīng)。
三個(gè)類(lèi),貓,老鼠和主人
貓
public sealed class Cat
{
// 貓叫時(shí)引發(fā)的事件
public event EventHandler Calling;
public void Call()
{
Console.WrietLine("貓叫了...");
if(Calling != null) // 檢查是否有事件注冊(cè)
Calling(this, EventArgs.Empty); // 調(diào)用事件注冊(cè)的方法。
}
}
// 老鼠,提供一個(gè)方法表示逃跑
public sealed calss Mouse
{
public void Escape(object sender, EventArgs e)
{
Console.WriteLine("老鼠逃跑了...");
}
}
// 主人,發(fā)生貓叫的時(shí)候驚醒
public sealed class Master
{
public void Wakened(object sender, EventArgs e)
{
Console.WriteLine("主人驚醒了...);
}
}
// 用于測(cè)試的執(zhí)行方法
// 程序入口點(diǎn)
public static Program
{
public static int Main(string[] args)
{
// 建立貓
Cat cat = new Cat();
// 建立老鼠
Mouse mouse = new Mouse();
// 建立主人
Master master = new Master();
// 注冊(cè)事件
cat.Calling += new EventHandler(mouse.Escape);
cat.Calling += new EventHandler(master.Wakened);
二、 選擇題 (每題2分 20 )
1、 進(jìn)行軟件質(zhì)量管理的重要性有:(ABCD)【中級(jí)】
A、維護(hù)降低成本 B、法律上的要求 C、市場(chǎng)競(jìng)爭(zhēng)的需要
D、質(zhì)量標(biāo)準(zhǔn)化的趨勢(shì) E、軟件工程的需要 F、CMM過(guò)程的一部分
G、方便與客戶(hù)進(jìn)一步溝通為后期的實(shí)施打好基礎(chǔ)
2、以測(cè)試的形態(tài)分測(cè)試可以分為:(ABC)【中級(jí)】
A、建構(gòu)性測(cè)試 B、系統(tǒng)測(cè)試 C、專(zhuān)項(xiàng)測(cè)試
D、單元測(cè)試 E、組件測(cè)試 F、集成測(cè)試
3、選出屬于黑盒測(cè)試方法的選項(xiàng)(ABC)【初級(jí)】
A、測(cè)試用例覆蓋 B、輸入覆蓋 C、輸出覆蓋
D、分支覆蓋 E、語(yǔ)句覆蓋 F、條件覆蓋
4、編寫(xiě)測(cè)試計(jì)劃的目的是:(ABC)【中級(jí)】
A、使測(cè)試工作順利進(jìn)行 B、使項(xiàng)目參與人員溝通更舒暢 C、使測(cè)試工作更加系統(tǒng)化
D、軟件工程以及軟件過(guò)程的需要 E、軟件過(guò)程規(guī)范化的要求 F、控制軟件質(zhì)量
5、依存關(guān)系有4種分別是:(ABCD)【高級(jí)】
A、開(kāi)始-結(jié)束 B、開(kāi)始-開(kāi)始 C、結(jié)束-開(kāi)始
D、結(jié)束-結(jié)束 E、開(kāi)始-實(shí)施-結(jié)束 F、結(jié)束-審核-開(kāi)始
6、軟件質(zhì)量管理(QM)應(yīng)有質(zhì)量保證(QA)和質(zhì)量控制(QC)組成,下面的選項(xiàng)屬于QC得是:(ABC)【高級(jí)】
A、測(cè)試 B、跟蹤 C、監(jiān)督
D、制定計(jì)劃 E、需求審查 F、程序代碼審查
7、實(shí)施缺陷跟蹤的目的是:(ABCD)【中級(jí)】
A、軟件質(zhì)量無(wú)法控制 B、問(wèn)題無(wú)法量化 C、重復(fù)問(wèn)題接連產(chǎn)生
D、解決問(wèn)題的知識(shí)無(wú)法保留 E、確保缺陷得到解決 F、使問(wèn)題形成完整的閉環(huán)處理
8、使用軟件測(cè)試工具的目的:(ABC)【中級(jí)】
A、幫助測(cè)試尋找問(wèn)題 B、協(xié)助問(wèn)題的診斷 C、節(jié)省測(cè)試時(shí)間
D、提高Bug的發(fā)現(xiàn)率 E、更好的控制缺陷提高軟件質(zhì)量 F、更好的協(xié)助開(kāi)發(fā)人員
9、典型的瀑布模型的四個(gè)階段是:(ABCD)【高級(jí)】
A、分析 B、設(shè)計(jì) C、編碼
D、測(cè)試 E、需求調(diào)研 F、實(shí)施
10、PSP是指?jìng)(gè)人軟件過(guò)程 ,是一種可用于( A )、( B )和( C )個(gè)人軟件工作方式的自我改善過(guò)程!靖呒(jí)】
A、控制 B、管理 C、改進(jìn)
D、高效 E、充分 F、適宜
三、 問(wèn)答題
1、測(cè)試人員在軟件開(kāi)發(fā)過(guò)程中的任務(wù)是什么?(初級(jí))(5分)
答:1、尋找Bug;
2、避免軟件開(kāi)發(fā)過(guò)程中的缺陷;
3、衡量軟件的品質(zhì);
4、關(guān)注用戶(hù)的需求。
總的目標(biāo)是:確保軟件的質(zhì)量。
2、在您以往的工作中,一條軟件缺陷(或者叫Bug)記錄都包含了哪些內(nèi)容?如何提交高質(zhì)量的軟件缺陷(Bug)記錄?(初級(jí))(6分)
答:一條Bug記錄最基本應(yīng)包含:編號(hào)、Bug所屬模塊、Bug描述、Bug級(jí)別、發(fā)現(xiàn)日期、發(fā)現(xiàn)人、修改日期、修改人、修改方法、回歸結(jié)果等等;要有效的發(fā)現(xiàn)Bug需參考需求以及詳細(xì)設(shè)計(jì)等前期文檔設(shè)計(jì)出高效的測(cè)試用例,然后嚴(yán)格執(zhí)行測(cè)試用例,對(duì)發(fā)現(xiàn)的問(wèn)題要充分確認(rèn)肯定,然后再向外發(fā)布如此才能提高提交Bug的質(zhì)量。
3、界面測(cè)試題及設(shè)計(jì)題。請(qǐng)找出下面界面中所存在的問(wèn)題并分別列出;用黑盒測(cè)試的任何一種方法設(shè)計(jì)出此登陸窗體的測(cè)試用例。(中級(jí))(6分)
答:1、窗體的標(biāo)題欄中為空,沒(méi)有給出標(biāo)題。2、用戶(hù)名和密碼控件的字體不一致并且沒(méi)有對(duì)齊。
3、文本框的大小不一致沒(méi)有對(duì)其。
4、確定和取消按鈕控件的大小不一致。
4、黑盒測(cè)試和白盒測(cè)試是軟件測(cè)試的兩種基本方法,請(qǐng)分別說(shuō)明各自的優(yōu)點(diǎn)和缺點(diǎn)。ㄖ屑(jí))(5分)
答:黑盒測(cè)試的優(yōu)點(diǎn)有:
1)比較簡(jiǎn)單,不需要了解程序內(nèi)部的代碼及實(shí)現(xiàn);2)與軟件的內(nèi)部實(shí)現(xiàn)無(wú)關(guān);
3)從用戶(hù)角度出發(fā),能很容易的知道用戶(hù)會(huì)用到哪些功能,會(huì)遇到哪些問(wèn)題;
4)基于軟件開(kāi)發(fā)文檔,所以也能知道軟件實(shí)現(xiàn)了文檔中的哪些功能;
5)在做軟件自動(dòng)化測(cè)試時(shí)較為方便。
黑盒測(cè)試的缺點(diǎn)有:
1)不可能覆蓋所有的代碼,覆蓋率較低,大概只能達(dá)到總代碼量的30%;2)自動(dòng)化測(cè)試的復(fù)用性較低。
白盒測(cè)試的優(yōu)點(diǎn)有:
幫助軟件測(cè)試人員增大代碼的覆蓋率,提高代碼的質(zhì)量,發(fā)現(xiàn)代碼中隱藏的問(wèn)題。
白盒測(cè)試的缺點(diǎn)有:
1)程序運(yùn)行會(huì)有很多不同的路徑,不可能測(cè)試所有的運(yùn)行路徑;
2)測(cè)試基于代碼,只能測(cè)試開(kāi)發(fā)人員做的對(duì)不對(duì),而不能知道設(shè)計(jì)的正確與否,可能會(huì)漏掉一些功能需求;
3)系統(tǒng)龐大時(shí),測(cè)試開(kāi)銷(xiāo)會(huì)非常大。
5、根據(jù)自己的理解回答什么是軟件測(cè)試,軟件測(cè)試分為哪幾個(gè)階段。(初級(jí))(5分)
答:軟件測(cè)試是一個(gè)為了尋找軟件中的錯(cuò)誤而運(yùn)行軟件的過(guò)程,一個(gè)成功的測(cè)試是指找到了迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試。
軟件測(cè)試一般分為單元測(cè)試、集成測(cè)試和系統(tǒng)測(cè)試。
6、根據(jù)自己的理解什么是測(cè)試用例和測(cè)試規(guī)程,設(shè)計(jì)一個(gè)測(cè)試用例應(yīng)當(dāng)從哪幾方面考慮?(中級(jí))(10分)
答:狹義的講,一個(gè)測(cè)試用例就是測(cè)試人員用以測(cè)試被測(cè)軟件的某個(gè)特性或特性組合的一組數(shù)據(jù)。這組數(shù)據(jù)可能是從用戶(hù)處得來(lái)的實(shí)際的一組數(shù)據(jù),也可能是測(cè)試人員專(zhuān)門(mén)設(shè)計(jì)出來(lái)的測(cè)試軟件某些功能的一組數(shù)據(jù)。
測(cè)試規(guī)程就是詳細(xì)的對(duì)測(cè)試用例設(shè)計(jì)方法、測(cè)試方法、測(cè)試工具、測(cè)試環(huán)境和測(cè)試數(shù)據(jù)進(jìn)行描述的文檔,還可以包括能把某個(gè)或某一組測(cè)試用例應(yīng)用到被測(cè)軟件上完成某項(xiàng)測(cè)試的一系列的操作步驟。
設(shè)計(jì)測(cè)試用例應(yīng)當(dāng)從以下幾方面考慮:邊界值,等價(jià)類(lèi)劃分,有效/無(wú)效值等。
7、 什么是軟件質(zhì)量保證?軟件質(zhì)量保證人員與開(kāi)發(fā)人員的關(guān)系如何?(高級(jí)) (10分)
答:軟件質(zhì)量保證就是通過(guò)確保軟件過(guò)程的質(zhì)量,來(lái)保證軟件產(chǎn)品的質(zhì)量。
軟件質(zhì)量保證人員和開(kāi)發(fā)人員之間具有管理上的嚴(yán)格的獨(dú)立性,兩個(gè)小組的管理員都不能越權(quán)管理另一組,但都可以向更高層的管理者匯報(bào)軟件開(kāi)發(fā)中的問(wèn)題
四、 設(shè)計(jì)題
1).輸入三個(gè)整數(shù),判斷三個(gè)整數(shù)能否構(gòu)成一個(gè)三角形,請(qǐng)用黑盒測(cè)試方法中的一種設(shè)計(jì)出相應(yīng)的測(cè)試用例并詳細(xì)說(shuō)明所使用的黑盒測(cè)試方法。(中高級(jí)) (15分)
【筆試題目(綜合版樣題)】相關(guān)文章:
OPPO筆試真題分享,筆試題目分享11-21
JAVA筆試題目之邏輯題02-25
AutoCAD筆試題目真題和答案12-20
面試筆試題目規(guī)律題及答案08-01
筆試題目11-06
職稱(chēng)英語(yǔ)樣題(綜合類(lèi))10-28
Google筆試題目12-14
城管筆試題目06-05