C#習題大全


1.String str=new String("a")String str = "a"有什么區別?

String str = "a"; 這個只是一個引用,內存中如果有“a"的話,str就指向它,如果沒有才創建如后還用到"a"這個字符串的話並且是這樣用: String str1 = "a"; String str2 = "a"; String str2 = "a"; 這4個變量都共享一個字符串"a" 而String str = new String("a");是根據"a"這個String對象再次構造一個String對象,將新構造出來的String對象的引用賦給str

2.判斷字符串變量str是否為空的一下三種方法哪個性能更優

a、str=="";b、str==String.Empty;c、str.Length==0;?答案是c;

3.stringString的區別

string、int是C#定義的類型,而String、Int32是.net類型即是CTS類型; string 是 .NET 框架中 System.String 的別名。string在編譯的時候會轉化為String類

4.虛方法(virtual )和抽象方法(abstract)的區別?

1:抽象方法僅有聲明,而沒有任何實現,如abstract someMethod();,虛方法卻不能如此

virtual用於修飾方法、屬性、索引器或事件聲明,並使它們可以在派生類中被重寫。
2:子類繼承父類,可以對父類中的虛方法進行重寫、覆蓋、不處理三種處理(見5),對抽象方法卻必須實現

5.子類對父類中虛方法的處理有重寫(override)和覆蓋(new),請說明它們的區別?

有父類ParentClass和子類ChildClass、以及父類的虛方法VirtualMethod。有如下程序段:
ParentClass pc = new ChildClass();pc.VirtualMethod(...);
如果子類是重寫(override)父類的VirtualMethod,則上面的第二行語句將調用子類的該方法
如果子類是覆蓋(new)父類的VirtualMethod,則上面的第二行語句將調用父類的該方法

6.抽象類(abstract)和接口(interface)的區別

抽象類可以有自己的實現,接口卻僅有聲明,可以有自己的靜態數據字段;
java和C#中可以實現多個接口,卻只能繼承一個抽象類(或者非抽象類)(單繼承,和c++的多繼承不同);

7.填空:

(1)面向對象的語言具有 繼承性多態性封裝性
(2)能用foreach遍歷訪問的對象需要實現 _IEnumerable___接口或聲明_GetEnumerator_方法的類型。
(3)列舉ADO.net中的五個主要對象

Connection,Command,DataReader,DataAdapter,DataSet

 connection 連接對象 
command 命令對象,指示要執行的命令和存儲過程! 
datareader是一個向前的只讀的數據流。 
dataadapter是功能強大的適陪器,支持增刪改查的功能 
dataset是一個數據級對象,相當與內存中的一張表或多張表

8.不定項選擇:

(1) 以下敘述正確的是:BC

A. 接口中可以有虛方法。 B. 一個類可以實現多個接口。

C. 接口不能被實例化。 D. 接口中可以包含已實現的方法。
(2) 從數據庫讀取記錄,你可能用到的方法有: BCD

A. ExecuteNonQuery B. ExecuteScalar C. Fill D. ExecuteReader
9.簡述 private protected public internal 修飾符的訪問權限。

A.Private:關鍵字是一個成員訪問修飾符。私有訪問是允許的最低訪問級別。私有成員只有在聲明它們的類和結構體中才是可訪問的, 同一體中的嵌套類型也可以訪問那些私有成員

B.Protected 關鍵字是一個成員訪問修飾符。受保護成員在它的類中可訪問並且可由派生類訪問。有關 protected 與其他訪問修飾符的比較,請參見可訪問性級別,只有在通過派生類類型發生訪問時,基類的受保護成員在派生類中才是可訪問的

C.Internal關鍵字是類型和類型成員的訪問修飾符。只有在同一程序集的文件中,內部類型或成員才是可訪問的

D Protected Internal   它可以看作是Protected與Internal的並集,意思是:如果是繼承關系,無論在不在同一程序集里都能訪問;如果不是繼承關系,那么只能在同一程序集內訪問。

E.Public具有最高級別的訪問權限,對訪問成員沒有限制。

10.寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer, 以自動增長的ID作為主鍵注意:ID

可能不是連續的。)
11.列舉ASP.NET 頁面之間傳遞值的幾種方式。

QueryString,Session和Server.Transfer
12.寫出程序的輸出結果
    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);

 }

}

13.寫出程序的輸出結果

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();

}

}
14.寫出程序的輸出結果:

 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);

}

}

15.一列數的規則如下: 1、1、2、3、5、8、13、21、34......求第30位數是多少, 用遞歸算法實現。

16.程序設計: 貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(C#語言)

要求: 1.要有聯動性,老鼠和主人的行為是被動的。2.考慮可擴展性,貓的叫聲可能引起其他聯動效應。

參考答案

1.(1) 繼承性、封裝性、多態性。 (2) IEnumerable 、 GetEnumerator (3) 對ADO.net的了解
2. (1) B、C (考對接口的理解) (2) B、C、D (考查對ADO.net的熟練程度)
3. private : 私有成員, 在類的內部才可以訪問。protected : 保護成員,該類內部和繼承類中可以訪問。public : 公共成員,完全公開,沒有訪問限制。internal: 在同一命名空間內可以訪問。
4. 解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

 5. 1.使用QueryString, 如....id=1; response. Redirect()2.使用Session變量3.使用Server.Transfer

  6. (考查值引用和對象引用)

10

21

0

Str

string being converted.

7. A B

A.Fun()

 (考查在繼承類中構造函數, 以及new 方法, )

8. 2
5
1
6
評分標准: 答對一點得2分,兩點得5分,3點得7分。全對得10分。
9. 
public class MainClass
{
public static void Main() 
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
評分標准: 寫出return Foo(i -1) + Foo(i - 2); 得5分。
寫出if(i > 0 && i <= 2) return 1; 得5分。
方法參數過多需要扣分(扣除分數 = 參數個數 - 1)
不用遞歸算法扣5分
(遞歸算法在樹結構建立等方面比較常用)
10.要點:1. 聯動效果,運行代碼只要執行Cat.Cryed()方法。2. 對老鼠和主人進行抽象
評分標准: <1>.構造出Cat、Mouse、Master三個類,並能使程序運行(2分)
<2>從Mouse和Master中提取抽象(5分)
<3>聯動效應,只要執行Cat.Cryed()就可以使老鼠逃跑,主人驚醒。(3分)
public interface Observer
{
void Response(); //觀察者的響應,如是老鼠見到貓的反映
}
public interface Subject
{
void AimAt(Observer obs); //針對哪些觀察者,這里指貓的要撲捉的對象---老鼠
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject subj)

this.name = name;
subj.AimAt(this);
}
public void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer

public Master(Subject subj)

subj.AimAt(this);
}

public void Response()
{
Console.WriteLine("Host waken!");

}
public class Cat : Subject
{
private ArrayList observers;
public Cat()

this.observers = new ArrayList();
}
public void AimAt(Observer obs)
{
this.observers.Add(obs);
}
public void Cry()
{
Console.WriteLine("Cat cryed!");
foreach (Observer obs in this.observers)
{
obs.Response();
}
}
}
class MainClass

static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}
//---------------------------------------------------------------------------------------------設計方法二: 使用event -- delegate設計..
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler SubEvent;
protected void FireAway()
{
if (this.SubEvent != null)
this.SubEvent();

}
public class Cat : Subject

public void Cry()
{
Console.WriteLine("cat cryed.");
this.FireAway();
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response(); 
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub) : base(sub)

this.name = name;
}
public override void Response()
{
Console.WriteLine(name + " attempt to escape!");
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub){}
public override void Response()
{
Console.WriteLine("host waken");
}
}
class Class1
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse("mouse1", cat);
Mouse mouse2 = new Mouse("mouse2", cat);
Master master = new Master(cat);
cat.Cry();
}
}

18.有哪幾種方法可以實現一個類存取另外一個類的成員函數及屬性,並請舉列來加以說明和分析.
19. A類是B類的基類,並且都有自己的構造,析構函數,請舉例證明B類從實例化到消亡過程中構造,析構函

 數的執行過程.請附code

 構造先父后子,析夠反之

public class TestB

    {

        public TestB()

        {

            Console.Write("begin create B object"r"n");

        }

        ~TestB()

        {

            Console.Write("begin destory B object"r"n");

        }

    }

    public class TestA : TestB

    {

        public TestA()

        {

            Console.Write("begin create A object"r"n");

        }

        ~TestA()

        {

           Console.Write("begin destory A object"r"n");

        }

    }


21..Net中讀寫數據庫需要用到哪些類?他們的作用

sqlconnection 連接數據庫,sqlcommand 執行T-SQL語句,或存儲過程
22.ASP.net的身份驗證方式有哪些?分別是什么原理?

asp.net提供了3種認證方式: windows身份驗證, Forms驗證和Passport驗證.windows, 身份驗證: IIS根據應用程序的設置執行身份驗證.要使用這種驗證方式,在IIS中必須禁用匿名訪問.Forms驗證:用Cookie來保存用戶憑證,並將未經身份驗證的用戶重定向到自定義的登錄頁.Passport驗證:通過Microsoft的集中身份驗證服務執行的,他為成員站點提供單獨登錄和核心配置文件服務.

23.解釋一下UDDIWSDL的意義及其作用。

UDDI(Universal Description, Discovery and Integration)統一描述、發現和集成協議,是為解決Web服務的發布和發現問題而制訂的新一代基於Internet的電子商務技術標准。它包含一組基於Web的、分布式的Web服務信息注冊中心的實現標准,以及一組使企業能將自己提供的Web服務注冊到該中心的實現標准。

UDDI利用SOAP消息來查找和注冊Web服務。並為應用程序提供了一系列接口來訪問注冊中心。

24.常用的調用webservice方法有哪些?三種

利用webservice.htc調用WebService方法

在Internet上調用WebService方法
25.講一講你理解的web service,dot net framework中,怎么很好的結合xml(講概念就行了)

Web Service就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web調用來實現某個功能的應用程序。Web Service是一種新的Web應用程序分支,它們是自包含、自描述、模塊化的應用,可以在網絡(通常為Web)中被描述、發布、查找以及通過Web來調用。Web Service便是基於網絡的、分布式的模塊化組件,它執行特定的任務,遵守具體的技術規范,這些規范使得Web Service能與其他兼容的組件進行互操作。它可以使用標准的互聯網協議,像超文本傳輸協議HTTP和XML,將功能體現在互聯網和企業內部網上。Web Service平台是一套標准,它定義了應用程序如何在Web上實現互操作性。你可以用你喜歡的任何語言,在你喜歡的任何平台上寫Web Service。可擴展的標記語言XML 是Web Service平台中表示數據的基本格式。除了易於建立和易於分析外,XML主要的優點在於它既與平台無關,又與廠商無關。XML是由萬維網協會(W3C)創建,W3C制定的XML SchemaXSD 定義了一套標准的數據類型,並給出了一種語言來擴展這套數據類型。
Web Service平台是用XSD來作為數據類型系統的。當你用某種語言如VB.NET或C# 來構造一個Web Service時,為了符合Web Service標准,所有你使用的數據類型都必須被轉換為XSD類型。如想讓它使用在不同平台和不同軟件的不同組織間傳遞,還需要用某種東西將它包裝起來。這種東西就是一種協議,如 SOAP。

26.C#可否對內存進行直接的操作?(這可是個難點哦?要注意!),如果能,如何操作;如果不能,為什么

可以,用指針來操作
27.描述一下C#中索引器的實現過程,是否只能根據數字進行索引?

C#通過提供索引器,可以象處理數組一樣處理對象。特別是屬性,每一個元素都以一個get或set方法暴露。索引器不單能索引數字(數組下標),還能索引一些HASHMAP的字符串,所以,通常來說,C#中類的索引器通常只有一個,就是THIS,但也可以有無數個,只要你的參數列表不同就可以了索引器和返回值無關, 索引器最大的好處是使代碼看上去更自然,更符合實際的思考模式.

28.面向對象的思想主要包括什么?

 封裝:用抽象的數據類型將數據和基於數據的操作封裝在一起,數據被保護在抽象數據類型內部。 
繼承:子類擁有父類的所有數據和操作。

多態:一個程序中同名的不同方法共存的情況。有兩種形式的多態– 重載與重寫。

29.什么是ASP.net中的用戶控件

有時可能需要控件中具有內置 ASP.NET Web 服務器控件未提供的功能。在這種情況下,您可以創建自己的控件。有兩個選擇。您可以創建:用戶控件。用戶控件是能夠在其中放置標記和 Web 服務器控件的容器。然后,可以將用戶控件作為一個單元對待,為其定義屬性和方法。

自定義控件。自定義控件是編寫的一個類,此類從 Control 或 WebControl 派生。

ASP.NET Web 用戶控件與完整的 ASP.NET 網頁(.aspx 文件)相似,同時具有用戶界面頁和代碼。可以采取與創建 ASP.NET 頁相似的方式創建用戶控件,然后向其中添加所需的標記和子控件。用戶控件可以像頁面一樣包含對其內容進行操作(包括執行數據綁定等任務)的代碼。

用戶控件與 ASP.NET 網頁有以下區別:

用戶控件的文件擴展名為 .ascx。

用戶控件中沒有 @ Page 指令,而是包含 @ Control 指令,該指令對配置及其他屬性進行定義。

用戶控件不能作為獨立文件運行。而必須像處理任何控件一樣,將它們添加到 ASP.NET 頁中。

用戶控件中沒有 htmlbody 或 form 元素。這些元素必須位於宿主頁中。

可以在用戶控件上使用與在 ASP.NET 網頁上所用相同的 HTML 元素(htmlbody 或 form 元除外)和 Web 控件。例如,如果您要創建一個將用作工具欄的用戶控件,則可以將一系列 Button Web服務器控件放在該控件上,並創建這些按鈕的事件處理程序。

創建用戶控件要比創建自定義控件方便很多,因為可以重用現有的控件。用戶控件使創建具有復雜用戶界面元素的控件極為方便。

30.什么叫應用程序域?什么是受管制的代碼?什么是強類型系統?什么是裝箱和拆箱?什么是重載?

   CTSCLSCLR分別作何解釋?

  應用程序域應用程序域為安全性、可靠性、版本控制以及卸載程序集提供了隔離邊界。應用程序域通常由運行庫宿主創建,運行庫宿主負責在運行應用程序之前引導公共語言運行庫。應用程序域提供了一個更安全、用途更廣的處理單元,公共語言運行庫可使用該單元提供應用程序之間的隔離。托管代碼使用基於公共語言運行庫的語言編譯器開發的代碼稱為托管代碼;托管代碼具有許多優點,例如:跨語言集成、跨語言異常處理、增強的安全性、版本控制和部署支持、簡化的組件交互模型、調試和分析服務等。裝箱和拆箱裝箱和拆箱使值類型能夠被視為對象。對值類型裝箱將把該值類型打包到 Object 引用類型的一個實例中。這使得值類型可以存儲於垃圾回收堆中。拆箱將從對象中提取值類型。重載每個類型成員都有一個唯一的簽名。方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成。只要簽名不同,就可以在一種類型內定義具有相同名稱的多種方法。當定義兩種或多種具有相同名稱的方法時,就稱作重載。CTS通用類型系統 (common type system)一種確定公共語言運行庫如何定義、使用和管理類型的規范。CLR公共語言運行庫.NET Framework 提供了一個稱為公共語言運行庫的運行時環境,它運行代碼並提供使開發過程更輕松的服務。CLS公共語言規范要和其他對象完全交互,而不管這些對象是以何種語言實現的,對象必須只向調用方公開那些它們必須與之互用的所有語言的通用功能。為此定義了公共語言規范 (CLS),它是許多應用程序所需的一套基本語言功能。強類型C#是強類型語言;因此每個變量和對象都必須具有聲明類型。

31.列舉一下你所了解的XML技術及其應用

可擴展標記語言XML(eXtensible Markup Language)[1]是一種簡單靈活的文本格式的可擴展標記語言,起源於SGML(Standard Generalized Markup Language),是SGML的一個子集合,也就是SGML的一個簡化版本,非常適合於在Web上或者其它多種數據源間進行數據的交換.

32.值類型和引用類型的區別?寫出C#的樣例代碼

基於值類型的變量直接包含值。將一個值類型變量賦給另一個值類型變量時,將復制包含的值。這與引用類型變量的賦值不同,引用類型變量的賦值只復制對對象的引用,而不復制對象本身。所有的值類型均隱式派生自System.ValueType。與引用類型不同,從值類型不可能派生出新的類型。但與引用類型相同的是,結構也可以實現接口。與引用類型不同,值類型不可能包含 null 值。然而,可空類型功能允許將 null 賦給值類型。每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。值類型主要由兩類組成:結構、枚舉,結構分為以下幾類:Numeric(數值)類型、整型、浮點型、decimal、bool、用戶定義的結構。引用類型的變量又稱為對象,可存儲對實際數據的引用。聲明引用類型的關鍵字:class、interface、delegate、內置引用類型: object、string

33.ADO.net中常用的對象有哪些?分別描述一下。

Connection 數據庫連接對象Command 數據庫命令DataReader 數據讀取器DataSet 數據集

34.如何理解委托?

委托類似於 C++ 函數指針,但它是類型安全的。委托允許將方法作為參數進行傳遞。委托可用於定義回調方法。委托可以鏈接在一起;例如,可以對一個事件調用多個方法。方法不需要與委托簽名精確匹配。有關更多信息,請參見協變和逆變。C# 2.0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數傳遞,以代替單獨定義的方法。

35.C#中的接口和類有什么異同。

異:不能直接實例化接口。接口不包含方法的實現。接口、類和結構可從多個接口繼承。但是C# 只支持單繼承:類只能從一個基類繼承實現。類定義可在不同的源文件之間進行拆分。

同:接口、類和結構可從多個接口繼承。接口類似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的所有成員。接口可以包含事件、索引器、方法和屬性。一個類可以實現多個接口。

37.UDP連接和TCP連接的異同。

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。 
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。

39.進程和線程分別怎么理解?

   進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。進程和線程的區別在於:簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.線程的划分尺度小於進程,使得多線程程序的並發性高。另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.

40.什么是code-Behind技術。

就是代碼隱藏,在ASP.NET中通過ASPX頁面指向CS文件的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程序的創建。比如分工,美工和編程的可以個干各的,不用再像以前asp那樣都代碼和html代碼混在一起,難以維護。

41..net中讀寫XML的類都歸屬於哪些命名空間?

System.XML類

42.什么是SOAP?有哪些應用。

SOAP(Simple Object Access Protocol )簡單對象訪問協議是在分散或分布式的環境中交換信息並執行遠程過程調用的協議,是一個基於XML的協議。使用SOAP,不用考慮任何特定的傳輸協議(最常用的還是HTTP協議),可以允許任何類型的對象或代碼,在任何平台上,以任何一直語言相互通信。

SOAP 是一種輕量級協議,用於在分散型、分布式環境中交換結構化信息。 SOAP 利用 XML 技術定義一種可擴展的消息處理框架,它提供了一種可通過多種底層協議進行交換的消息結構。這種框架的設計思想是要獨立於任何一種特定的編程模型和其他特定實現的語義。SOAP 定義了一種方法以便將 XML 消息從 A 點傳送到 B 點。 為此,它提供了一種基於 XML 且具有以下特性的消息處理框架:1) 可擴展,2) 可通過多種底層網絡協議使用,3) 獨立於編程模型。

43.如何理解.net中的垃圾回收機制。

   .NET Framework 的垃圾回收器管理應用程序的內存分配和釋放。每次您使用 new 運算符創建對象時,運行庫都從托管堆為該對象分配內存。只要托管堆中有地址空間可用,運行庫就會繼續為新對象分配空間。但是,內存不是無限大的。最終,垃圾回收器必須執行回收以釋放一些內存。垃圾回收器優化引擎根據正在進行的分配情況確定執行回收的最佳時間。當垃圾回收器執行回收時,它檢查托管堆中不再被應用程序使用的對象並執行必要的操作來回收它們占用的內存。

44.什么是WEB控件?使用WEB控件有那些優勢?

運行在服務器端的控件,只要將HTML控件加上runat=server.
45.請談談對正則表達式的看法?

正則表達式是一種處理文本的有用工具。無論是驗證用戶輸入、搜索字符串內的模式、還是以各種有效方式重新設置文本格式,正則表達式都非常有用。

46.WEB控件可以激法服務端事件,請談談服務端事件是怎么發生並解釋其原理?自動傳回是什么?為什么

要使用自動傳回。

在web控件發生事件時,客戶端采用提交的形式將數據交回服務端,服務端先調用Page_Load事件,然后根據傳回的狀態信息自動調用服務端事件自動傳回是當我們在點擊客戶端控件時,采用提交表單的形式將數據直接傳回到務端只有通過自動傳回才能實現服務端事件的機制,如果沒有自動回傳機制就只能調用客戶端事件,而不能調用服務端事件

47.WEB控件及HTML服務端控件能否調用客戶端方法?如果能,請解釋如何調用?

 可以調用,例如:<asp:TextBox id="TextBox1" onclick="clientfunction();" runat="server">
</asp:TextBox><INPUT id="Button2" value="Button" name="Button2"runat="server" onclick="clientfunction();">

48.請解釋web.config文件中的重要節點

Web.config文件是一個XML文本文件,它用來儲存 ASP.NET Web 應用程序的配置信息(如最常用的設置ASP.NET Web 應用程序的身份驗證方式),它可以出現在應用程序的每一個目錄中。當你通過VB.NET新建一個Web應用程序后,默認情況下會在根目錄自動創建一個默認的Web.config文件,包括默認的配置設置,所有的子目錄都繼承它的配置設置。如果你想修改子目錄的配置設置,你可以在該子目錄下新建一個Web.config文件。它可以提供除從父目錄繼承的配置信息以外的配置信息,也可以重寫或修改父目錄中定義的設置。 1、<authentication> 節作用:配置 ASP.NET 身份驗證支持(為Windows、Forms、PassPort、None四種)。該元素只能在計算機、站點或應用程序級別聲明。<authentication> 元素必需與<authorization> 節配合使用。示例:以下示例為基於窗體(Forms)的身份驗證配置站點,當沒有登陸的用戶訪問需要身份驗證的網頁,網頁自動跳轉到登陸網頁。<authentication mode="Forms" > <forms loginUrl="logon.aspx" name=".FormsAuthCookie"/></authentication> 其中元素loginUrl表示登陸網頁的名稱,name表示Cookie名稱2、<authorization> 節作用:控制對 URL 資源的客戶端訪問(如允許匿名用戶訪問)。此元素可以在任何級別(計算機、站點、應用程序、子目錄或頁)上聲明。必需與<authentication> 節配合使用。3、<compilation>節作用:配置 ASP.NET 使用的所有編譯設置。默認的debug屬性為“True”.在程序編譯完成交付使用之后應將其設為True(Web.config文件中有詳細說明,此處省略示例)4、<customErrors>作用:為 ASP.NET 應用程序提供有關自定義錯誤信息的信息。它不適用於 XML Web services 中發生的錯誤。5、<httpRuntime>節作用:配置 ASP.NET HTTP 運行庫設置。該節可以在計算機、站點、應用程序和子目錄級別聲明。 6、 <pages>作用:標識特定於頁的配置設置(如是否啟用會話狀態、視圖狀態,是否檢測用戶的輸入等)。<pages>可以在計算機、站點、應用程序和子目錄級別聲明。7、<sessionState>  作用:為當前應用程序配置會話狀態設置(如設置是否啟用會話狀態,會話狀態保存位置)。 8、<trace>  作用:配置 ASP.NET 跟蹤服務,主要用來程序測試判斷哪里出錯。

49.請解釋ASP.NET中的web頁面與其隱藏類之間的關系?

   一個ASP.NET頁面一般都對應一個隱藏類,一般都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明如下<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>Codebehind="Tst1.aspx.cs" 表明經編譯此頁面時使用哪一個代碼文件Inherits="T1.Tst1" 表用運行時使用哪一個隱藏類

50.什么是viewstate,能否禁用?是否所用控件都可以禁用

Viewstate是保存狀態的一種機制,EnableViewState屬性設置為false即可禁用

ViewState 是由   ASP.NET   頁面框架管理的一個隱藏的窗體字段。當 ASP.NET 執行某個頁面時,該頁面上的 ViewState   值和所有控件將被收集並格式化成一個編碼字符串,然后被分配給隱藏窗體字段的值屬性(即<input   type=hidden>)。由於隱藏窗體字段是發送到客戶端的頁面的一部分,所以 ViewState 值被臨時存儲在客戶端的瀏覽器中。如果客戶端選擇將該頁面回傳給服務器,則ViewState 字符串也將被回傳。回傳后,ASP.NET 頁面框架將解析ViewState字符串,並為該頁面和各個控件填充 ViewState屬性。然后,控件再使用 ViewState 數據將自己重新恢復為以前的狀態
51.當發現不能讀取頁面上的輸入的數據時很有可能是什么原因造成的?怎么解決

很有可能是在Page_Load中數據處理時沒有進行Page的IsPostBack屬性判斷
52.請解釋一個WEB頁面中代碼執行次序。

Init,Load,PreRender事件執行順序:

1)控件的Init事件

2)控件所在頁面的Init事件

3)控件所在頁面的Load事件

4)控件的Load事件

5)控件所在頁面的PreRender事件

6)控件的PreRender事件

規律:

1)Init事件從最里面的控件(包括用戶控件及普通控件)向最外面的控件(頁面)引發,Load及PreRender等其他事件從最外面的控件向最里面的控件引發;

2)控件之間相同事件的執行順序依控件在頁面的位置按從左到右,從上到下的先后順序執行。

注意:

1)切記用戶控件也被視為頁面中的一個控件;

2)把用戶控件作為單獨的一個特殊頁面來看,它本身及其所包含的控件同樣遵守相同的規律;

3)有時在客戶端程序(如javascript)中會用到客戶端body對像的onload事件,注意這個客戶端事件是最后執行,即在服務器端所有事件執行完后才執行. 
53.請解釋什么是上下文對象,在什么情況下要使用上下文對象

上下文對象是指HttpContext類的Current 屬性,當我們在一個普通類中要訪問內置對象(Response,Request,Session,Server,Appliction等)時就要以使用此對象

54.請解釋轉發與跳轉的區別?

轉發就是服務端的跳轉A頁面提交數據到B頁面,B頁面進行處理然后從服務端跳轉到其它頁面跳轉就是指客戶端的跳轉

55.請解釋ASP.NET中不同頁面之間數據傳遞有那些方式?

 session(viewstate) 簡單,但易丟失,application 全局,cookie 簡單,但可能不支持,可能被偽造input ttype="hidden" 簡單,可能被偽造,url參數 簡單,顯示於地址欄,長度有限,數據庫 穩定,安全,但性能相對弱

56.請解釋ASP.NETbutton linkbutton imagebutton hyperlink這四個控件之間的功別

1.Button和ImageButton用於將數據傳遞回服務器.

2.Hyperlink用於在頁面之間導航

3.LinkButton用於將數據保存到服務器或訪問服務器上的數據

4.LinkButton 控件具有與 HyperLink 控件相同的外觀,不過卻具有與 Button 控件相同的功能

57.請解釋一下.NET多層應用程序中層與層之間以那幾種方式進行數據傳遞。並解釋你自己的項目中采用那

種方式進行

自定義類結構傳數據
58.如果需要在GridView控件中的某一列中添加下拉列表框並綁定數據怎么解決?

后台的Rowdatabound事件可以進行綁定,比如這樣

if(數據行)

{

    DropDownList ddl = (DropDownList)e.row.FindControl("DropDownListID");

    ddl.datasource = 數據源;(假定你已經設置了key和value綁定字段)

    ddl.databind();

}
59.請解釋asp.net中的數據綁定與傳統數據綁定有什么區別?

傳統的數據綁定是一種“連接數據綁定”,即在數據綁定期間,客戶端一直保持與數據庫的連接,這種狀態下,數據庫的性能大受影響。asp.net的數據綁定是一種“非連接數據綁定”,即只在讀取和更新數據的瞬間,才與數據庫連接並交換數據,之后便可釋放與數據庫的連接,數據庫的性能因此將大大提高。

60.請解釋接口的顯式實現有什么意義?

接口可以有靜態成員、嵌套類型、抽象、虛擬成員、屬性和事件。實現接口的任何類都必須提供接口中所聲明的抽象成員的定義。接口可以要求任何實現類必須實現一個或多個其他接口。

1、因為顯式接口成員執行體不能通過類的實例進行訪問,這就可以從公有接口中把接口的實現部分單獨分離開。如果一個類只在內部使用該接口,而類的使用者不會直接使用到該接口,這種顯式接口成員執行體就可以起到作用。

2、顯式接口成員執行體避免了接口成員之間因為同名而發生混淆。如果一個類希望對名稱和返回類型相同的接口成員采用不同的實現方式,這就必須要使用到顯式接口成員執行體。如果沒有顯式接口成員執行體,那么對於名稱和返回類型不同的接口成員,類也無法進行實現。

61.您在什么情況下會用到虛方法?它與接口有什么不同?

當在繼承類中想重寫某一方法時會用到虛方法;虛方法是類的成員函數,接口相當於抽象類
62.Override與重載有什么區別?

重載是提供了一種機制, 相同函數名通過不同的返回值類型以及參數來表來區分的機制

override是用於重寫基類的虛方法,這樣在派生類中提供一個新的方法

覆寫(Override)的兩個函數的函數特征相同,重載(Overload)的兩個函數的函數名雖然相同,但函數特征不同。

函數特征包括函數名,參數的類型和個數。

1. override

使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。

不能重寫非虛方法或靜態方法。重寫基方法必須是虛擬的、抽象的或重寫的。

也就是說,用 override 修飾符重寫的基類中的方法必須是 virtual, abstract 或 override 方法

2. 重載

當類包含兩個名稱相同但簽名不同的方法時發生方法重載。

使用重載方法的指南:

a. 用方法重載來提供在語義上完成相同功能的不同方法。

b. 使用方法重載而不是允許默認參數。默認參數的版本控制性能不好,因此公共語言規范(CLS)中不允許使用默認參數。

c. 正確使用默認值。在一個重載方法系列中,復雜方法應當使用參數名來指示從簡單方法中假定的默認狀態發生的更改。

d. 對方法參數使用一致的排序和命名模式。提供一組重載方法,這組重載方法帶有遞增數目的參數,以使開發人員可以指定想要的級別的信息,這種情況很常見。您指定的參數越多,開發人員就可指定得越詳細。

e. 如果必須提供重寫方法的能力,請僅使最完整的重載是虛擬的並根據它來定義其他操作。

// 下面具體解釋一下這種模式,只有最后一個方法(參數最完整的方法)是虛方法,在繼承了這個類的子類中只要重寫(override)這個方法就行了。

63.怎樣理解靜態變量?

靜態變量具有在某一個類中具有全局型.
64.向服務器發送請求有幾種方式?

Post,Get.
65.DataReaderDataset有什么區別?

DataReader和DataSet最大的區別在於,DataReader使用時始終占用SqlConnection,在線操作數據庫.任何對SqlConnection的操作都會引發DataReader的異常.因為DataReader每次只在內存中加載一條數據,所以占用的內存是很小的..因為DataReader的特殊性和高性能.所以DataReader是只進的.你讀了第一條后就不能再去讀取第一條了. DataSet則是將數據一次性加載在內存中.拋棄數據庫連接.讀取完畢即放棄數據庫連接.因為DataSet將數據全部加載在內存中.所以比較消耗內存.但是確比DataReader要靈活.可以動態的添加行,列,數據.對數據庫進行回傳更新操作

66.如果在一個B/S結構的系統中需要傳遞變量值,但是又不能使用SessionCookieApplication,您有

幾種方法進行處理?

使用Request["string"].Request.QueryString["flag"]
67..netB/S結構的系統,您是用幾層結構來開發,每一層之間的關系以及為什么要這樣分層?

一般為3層 , 數據訪問層,業務層,表示層。數據訪問層對數據庫進行增刪查改。業務層一般分為二層,業務表觀層實現與表示層的溝通,業務規則層實現用戶密碼的安全等。表示層為了與用戶交互例如用戶添加表單。優點:分工明確,條理清晰,易於調試,而且具有可擴展性。缺點:增加成本。

68.軟件開發過程一般有幾個階段?每個階段的作用?

1)問題定義;2)可行性研究;3)需求分析;4)總體設計;5)詳細設計;6)編碼和單元測試;7)綜合測試;8)軟件維護。

69.微軟推出了一系列的Application Block,請舉出您所知道的Application Block並說明其作用?

SqlHelper 列如:SqlHelper.ExcuteDataSet()執行存儲過程.
70.請列舉一些您用到過的設計模式以及在什么情況下使用該模式?

抽象工廠
71.通過超鏈接怎樣傳遞中文參數?

傳遞時用HttpUtility.UrlEncodeUnicode("中文參數"),獲取時直接用Request.QueryString["參數"]就行了<%@ import namespace="System.Web.Util"%>

72.請編程遍歷頁面上所有TextBox控件並給它賦值為string.Empty

foreach (Control a in this.Page.Form.Controls)

        {

            string name = a.GetType().Name;

            if (a.GetType().Name == "TextBox")

            {

                TextBox mm = a as TextBox;

                mm.Text = string.Empty;

            }                                 

        }

73.請編程實現一個冒泡排序算法?

private static int[] Sort(int[] arrayNum)

        {

            int i, j, k;

            bool exchange;

            for (i = 1; i < arrayNum.Length; i++)

            {

                exchange = false;

                for (j = arrayNum.Length - 1; j >= i; j--)

                {

                    if (arrayNum[j - 1] > arrayNum[j])

                    {

                        k = arrayNum[j];

                        arrayNum[j] = arrayNum[j - 1];

                        arrayNum[j - 1] = k;

                        exchange = true;

                    }

                }

                if (!exchange)

                {

                    break;

                }

            }

            return arrayNum;

        }

75.進程和線程的區別

進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位,一個進程可以有多個線程,這些線程共享這個進程的資源。

76.成員變量和成員函數前加static的作用

它們被稱為常成員變量和常成員函數,又稱為類成員變量和類成員函數。分別用來反映類的狀態。比如類成員變量可以用來統計類實例的數量,類成員函數負責這種統計的動作。

77.堆和棧的區別

棧:由編譯器自動分配、釋放。在函數體中定義的變量通常在棧上。堆:一般由程序員分配釋放。用new、malloc等分配內存函數分配得到的就是在堆上。棧是機器系統提供的數據結構,而堆則是C/C++函數庫提供的。棧是系統提供的功能,特點是快速高效,缺點是有限制,數據不靈活;而棧是函數庫提供的功能,特點是靈活方便,數據適應面廣泛,但是效率有一定降低。棧是系統數據結構,對於進程/線程是唯一的;堆是函數庫內部數據結構,不一定唯一。不同堆分配的內存無法互相操作。棧空間分靜態分配和動態分配兩種。靜態分配是編譯器完成的,比如自動變量(auto)的分配。動態分配由alloca函數完成。棧的動態分配無需釋放(是自動的),也就沒有釋放函數。為可移植的程序起見,棧的動態分配操作是不被鼓勵的!堆空間的分配總是動態的,雖然程序結束時所有的數據空間都會被釋放回系統,但是精確的申請內存/釋放內存匹配是良好程序的基本要素。

78. C# property  attribute的區別,他們各有什么用處,這種機制的好處在哪里?

在C#中有兩個屬性,分別為Property和Attribute, Property比較簡單,就是我們常用的get和set,主要用於為類中的private和protected變量提供讀取和設置的接口。Attribute用來說明這個事物的各種特征的一種描述。而Attribute就是干這事的。它允許你將信息與你定義的C#類型相關聯,作為類型的標注。這些信息是任意的,就是說,它不是由語言本身決定的,你可以隨意建立和關聯任何類型的任何信息。你可以作用屬性定義設計時信息和運行時信息,甚至是運行時的行為特征。關鍵在於這些信息不僅可以被用戶取出來作為一種類型的標注,它更可以被編譯器所識別,作為編譯時的一種附屬條件參加程序的編譯。定義屬性:屬性實際上是一個派生自System.Attribute基類的類。System.Attribute類含有幾個用於訪問和檢查自定義屬性的方法。盡管你有權將任何類定義為屬性,但是按照慣例來說,從System.Attribute派生類是有意義的

79.C#可否對內存進行直接的操作?

可以,我們知道,.NET相比C++最值得稱贊的是他的GC(垃圾回收機制)。GC會在系統空閑或內存不足的時候自動回收不再被使用的對象。因此,我們不再需要向C++編程一樣處處小心內存泄漏。同時,為了提高內存的使用效率,GC在回收內存的時候,會對內存進行整理,有些類似硬盤整理的原理。從而導致對象被在內存中移位。

80.維護數據庫的完整性、一致性、你喜歡用觸發器還是自寫業務邏輯?為什么

   盡可能用約束(包括CHECK、主鍵、唯一鍵、外鍵、非空字段)實現,這種方式的效率最好;其次用觸發器,這種方式可以保證無論何種業務系統訪問數據庫都能維持數據庫的完整性、一致性;最后再考慮用自寫業務邏輯實現,但這種方式效率最低、編程最復雜,當為下下之策。

81.ADO.NET相對於ADO等主要有什么改進?

ADO以Recordset存儲,而ADO.NET則以DataSet表示。Recordset看起來更像單表,如果讓Recordset以多表的方式表示就必須在SQL中進行多表連接。反之,DataSet可以是多個表的集合。ADO 的運作是一種在線方式,這意味着不論是瀏覽或更新數據都必須是實時的。ADO.NET則使用離線方式,在訪問數據的時候ADO.NET會利用XML制作數據的一份幅本,ADO.NET的數據庫連接也只有在這段時間需要在線。由於ADO使用COM技術,這就要求所使用的數據類型必須符合COM規范,而ADO.NET基於XML格式,數據類型更為豐富並且不需要再做COM編排導致的數據類型轉換,從而提高了整體性能。

82.C#中要使一個類支持FOREACH遍歷,實現過程怎樣?

若要循環訪問集合,集合必須滿足特定的要求。例如,在下面的 foreach 語句中:

   foreach (ItemType item in myCollection)

myCollection 必須滿足下列要求:

集合類型:

必須是 interfaceclass 或 struct

必須包括返回類型的名為 GetEnumerator 的實例方法,例如 Enumerator。

Enumerator 類型(類或結構)必須包含:

一個名為 Current 的屬性,它返回 ItemType 或者可以轉換為此類型的類型。屬性訪問器返回集合的當前元素。

一個名為 MoveNext 的 bool 方法,它遞增項計數器並在集合中存在更多項時返回 true

有三種使用集合的方法:

1.使用上述指導創建一個集合。此集合只能用於 C# 程序。

2.使用上述指導創建一個一般集合,另外實現 IEnumerable 接口。此集合可用於其他語言(如 Visual Basic)。

3.在集合類中使用一個預定義的集合。

83.接口和抽象類有什么區別?你選擇使用接口和抽象類的依據是什么?

接口是一個純粹的抽象類,沒有任何實際的東西,只是定義了一個框架,而抽象類里面可以有實際的一個方法,並不要求所有的方法都是抽象的。可以實現一個接口中的所有方法,也可以繼承一個抽象的類,然后覆寫其中的方法。接口一般只有方法,而沒有數據成員或屬性。抽象類有方法,也有數據成員或屬性,一般情況下,優先考慮用接口,只有當可能要訪問到數據成員或屬性時,用抽象類。

84.自定義控件和一般用戶控件的異同?如果要用這兩者之一,你會選擇哪種?為什么

用戶控件模型適合創建內部,應用程序特定的控件,而自定義控件模型更適合創建通用的和可再分發的控件

85.大概描述一下ASP.NET服務器控件的生命周期

1. 初始化  - Init 事件 (OnInit 方法)

2. 加載視圖狀態 - LoadViewState 方法

3. 處理回發數據 - LoadPostData 方法:s對實現 IPostBackDataHandler 接口的控件,即可以自動加載回發數據的控件,如 TextBox, DropDownList 等。

4. 加載 - Load 事件 (OnLoad 方法)

5. 發送回發更改通知 - RaisePostDataChangedEvent 方法 :對實現 IPostBackDataHandler 接口的控件,即可以自動加載回發數據的控件。    在第 3 步中加載回發數據,如果回發前后數據發生更改,則在這一步觸發相應的服務端事件。

6. 處理回發事件 - RaisePostBackEvent 方法:對實現 IPostBackEventHandler 接口的控件,即能引起回發的控件,如 Button, LinkButton, Calendar 等

7. 預呈現 - PreRender 事件 (OnPreRender 方法)

8. 保存視圖狀態 - SaveViewState 方法

9. 呈現 - Render 方法

10. 處置 - Dispose 方法

11. 卸載 - UnLoad 事件 (OnUnLoad 方法)

86.UML

統一建模語言( U M L)是一個通用的可視化建模語言,用於對軟件進行描述、可視化處理、構造和建立軟件系統制品的文檔。它記錄了對必須構造的系統的決定和理解,可用於對系統的理解、設計、瀏覽、配置、維護和信息控制。

87.談談final, finally, finalize的區別。

final 修飾符用於指定類不能擴展或者方法或屬性不能重寫。它將防止其他類通過重寫重要的函數來更改該類的行為。帶有 final 修飾符的方法可以由派生類中的方法來隱藏或重載。finally 塊用於清除在 try 塊中分配的任何資源。控制總是傳遞給 finally 塊,與 try 塊的存在方式無關。finalize允許 Object 在“垃圾回收”回收 Object 之前嘗試釋放資源並執行其他清理操作。

88.&&&的區別。

&&為邏輯與,輸出結果為布爾(真假)型; &為按位與,輸出結果為數值型。

89.GC是什么 為什么要有GC

GC是垃圾收集器。這個類別中的方法會影響什么時候對對象執行內存回收,以及什么時候釋放對象所配置的資源。這個類別的屬性會提供系統中可用內存的總數量以及配置至對象的內存之年齡分類或層代等等相關信息。內存回收行程會追蹤並重新利用在 Managed 內存中配置的對象。內存回收行程會定期執行內存回收來重新利用配置給對象的內存 (該對象並無有效的參考)。當沒有可用的內存來因應內存的要求時,會自動發生內存回收。或者,應用程序可以使用 Collect方法來強制進行內存回收。

內存回收包含下列步驟:

a.內存回收行程會搜尋在 Managed 程序代碼中所參考的 Managed 對象。

b.內存回收行程會嘗試最終處理未參考的對象。

c.內存回收行程會釋放未參考並且回收其內存的對象。

90.Math.round(11.5)等於多少 Math.round(-11.5)等於多少

Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數最接近的長整數,參數加1/2

求其floor

91.short s1 = 1; s1 = s1 + 1;有什么錯 short s1 = 1; s1 += 1;有什么錯

short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)

short s1 = 1; s1 += 1;(可以正確編譯)

92.數組有沒有length()這個方法 String有沒有length()這個方法:

在c#數組和string只有length屬性,沒有方法

93.abstract classinterface有什么區別

  abstract 修飾詞可用於類別、方法、屬性、索引子 (Indexer) 和事件。在類別宣告里使用 abstract

飾詞,表示該類別只是當做其它類別的基底類別而已。成員如果標記為抽象,或是包含在抽象類(Abstract Class) 內,則必須由衍生自此抽象類別的類別實作這個成員。

在靜態屬性上使用 abstract 修飾詞是錯誤的。

在抽象方法宣告中使用 static 或 virtual 修飾詞是錯誤的。

接口只包含方法、委派或事件的簽章。方法的實作 (Implementation) 是在實作接口的類別中完成,

94.是否可以繼承String

   否,無法繼承自密封類

95.try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后

    會,在return后.

96.兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對

不對,有相同的GetHashCode();

97.當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,並可返回變化后的結果,那

這里到底是值傳遞還是引用傳遞

引用傳遞
98.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String

都可以
99.編程題寫一個Singleton出來。
100.c#中的三元運算符是

a?b:c

101.當整數a賦值給一個object對象時,整數a將會被

   裝箱

102.類成員有_____種可訪問形式?

this.;new Class().Method;
103.public static const int A=1;這段代碼有錯誤么?是什么?

const不能用static修飾
104.float f=-123.567F; int i=(int)f; i的值現在是

-123
105.委托聲明的關鍵字是______ delagete
106.sealed修飾的類有什么特點?

密封,不能繼承sealed 修飾詞可套用至類別 (Class)、執行個體方法 (Instance Method) 和屬性。密封類別無法被繼承。密封方法會覆寫基底類別 (Base Class ) 中的方法,但在任何衍生類別中卻無法進一步覆寫密封方法本身。當套用至方法或屬性時,sealed 修飾詞必須一律和 override (C# 參考) 搭配使用。

107.Asp.net中所有的自定義用戶控件都必須繼承自

System.Web.UI.UserControl
108..Net中所有可序列化的類都被標記為_____

[Serializable]
109..Net托管代碼中我們不用擔心內存漏洞

GC
110..當類T只聲明了私有實例構造函數時,則在T的程序文本外部,___不可以___(可以 or 不可以)從T

派生出新的類,不可以 直接創建T的任何實例。
111.下面這段代碼有錯誤么?

錯誤

 switch (i){

 case():

CaseZero();

break;

 case 1:

 CaseOne();

break;

 case 2:

 dufault; //wrong

CaseTwo();

break;

 }
112..Net中,類System.Web.UI.Page 可以被繼承么?

可以
113.c#usingnew這兩個關鍵字有什么意義,請寫出你所知道的意義?

new 關鍵詞可當做運算子、修飾詞或條件約束 (Constraint) 使用。

用來建立對象並叫用 (Invoke) 建構函式

Class1 o = new Class1();

當 new 關鍵詞做為修飾詞時,會明確隱藏繼承自基底類別的成員。隱藏繼承的成員表示成員的衍生版本取代了基底類別版本。可以不使用 new 修飾詞隱藏成員,但這么做會產生警告。使用 new 明確隱藏成員會隱藏這個警告,並記錄使用衍生版本來替代。

new 條件約束 (Constraint) 指定在泛用類別宣告中的任何型別參數,都必須具有公用的無參數建構函式。當您的泛用類別建立型別的新執行個體時,將此條件約束套用至型別參數

class ItemFactory<T> where T : new()

{

     public T GetNewItem()

      {

         return new T();

       }

}

using 關鍵詞有兩種主要的用法:

做為指示詞,此時它是用來建立命名空間的別名,或是用來匯入在其它命名空間中定義的型別。請參閱 using 指示詞。

做為陳述式,此時它是用來定義一個范圍,對象會在此范圍結尾處進行處置 (Dispose)。請參閱 using 陳述式。

114.談談類和結構的區別?

類是引用類型、結構是值類型

結構與類別使用的語法幾乎相同,不過結構的限制比類別多:

結構執行個體字段宣告不可使用初始設定式,即使結構上的靜態字段可初始化也一樣

結構不可宣告預設建構函式,即沒有參數的建構函式或解構函式

結構有下列屬性:

結構是值類型,而類別為引用類型

當傳遞結構到方法上時,是以傳值而非以當做參考的方式傳遞

與類別不同的是,結構不需使用 new 運算子就能執行個體化

結構可以宣告建構函式,但是必須采用參數

結構無法從另一個結構或類別繼承而來,且它不能成為類別的基底。所有結構都是從繼承自 System.Object 的 System.ValueType 直接繼承而來

結構可實作接口

在結構里初始化執行個體字段是錯誤的
115.一個長度為10000的字符串,通過隨機從a-z中抽取10000個字符組成。請用c#語言編寫主要程序來

實現。

string[] LetterList = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };

            StringBuilder sbRe = new StringBuilder();

            Random rd=new Random();

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

            {

                sbRe.Append(LetterList[rd.Next(26)]);

            }

        Console.Write(sbRe.ToString());
116.對於這樣的一個枚舉類型:

 enum Color:byte{

Red,

 Green,

 Blue,

 Orange

}

試寫一段程序顯示出枚舉類型中定義的所有符號名稱以及它們對應的數值。

foreach (string aa in Enum.GetNames(typeof(Color)))

            {

                Console.Write(aa);

                Console.Write(""r"n");

            }

            foreach (byte aa in Enum.GetValues(typeof(Color)))

            {

                Console.Write(aa);

                Console.Write(""r"n");

            }

117.寫一個實現對一段字符串翻轉的方法,附加一些條件,如其中包括“,”、“..

 string kk = "abc',.字符串";

            string reKK = "";

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

            {

                reKK = kk[i] + reKK;

            }

            Console.Write(reKK);

118.什么是虛函數?

Virtual CallSomeOne();
119.什么是抽象函數?

public abstract void CallSomeOne(); 
120.觸發器的作用

觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫本身標准的功能有更精細和更復雜的數據控制能力。數據庫觸發器有以下的作用:

安全性。可以基於數據庫的值使用戶具有操作數據庫的某種權利。

可以基於時間限制用戶的操作,例如不允許下班后和節假日修改數據庫數據。

可以基於數據庫中的數據限制用戶的操作,例如不允許股票的價格的升幅一次超過10%。

審計。可以跟蹤用戶對數據庫的操作。

審計用戶操作數據庫的語句。

把用戶對數據庫的更新寫入審計表。

實現復雜的數據完整性規則。

實現非標准的數據完整性檢查和約束。觸發器可產生比規則更為復雜的限制。與規則不同,觸發器可以引用列或數據庫對象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。

提供可變的缺省值。

實現復雜的非標准的數據庫相關完整性規則。觸發器可以對數據庫中相關的表進行連環更新。例如,在auths表author_code列上的刪除觸發器可導致相應刪除在其它表中的與之匹配的行。

在修改或刪除時級聯修改或刪除其它表中的與之匹配的行。

在修改或刪除時把其它表中的與之匹配的行設成NULL值。

在修改或刪除時把其它表中的與之匹配的行級聯設成缺省值。

觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵時,這種觸發器會起作用。例如,可以在 books.author_code列上生成一個插入觸發器,如果新值與auths.author_code列中的某值不匹配時,插入被回退。

121.求以下表達式的值,寫出您想到的一種或幾種實現方法:

1-2+3-4+……+m

public static int Foo(int i)

        {

            int result = 0;

            for (int j = 1; j < i; j++)

            {

                if (j % 2 == 0)

                {

                    result = result - j;

                }

                else if (j % 2 == 1)

                {

                    result = result + j;

                }

            }

            return result;

        }
122.C#中的委托是什么?事件是不是一種委托?

委派是參考方法的一種型別,一旦將一個方法指定給某委派,則該委派的行為便會與該方法完全相同。委派方法可以當做任何其它方法一般使用,也有參數和傳回值,

任何與委派的簽名碼 (即由傳回型別和參數所組成) 相符的方法,都可指派給委派。如此便可利用程序設計的方式變更方法呼叫,也可將新的程序代碼外掛至現有類別中。只要您知道委派的簽名碼為何,即可指派自己的委派方法。

由於委派能夠將方法當做參數來參考,使得委派很適合用來定義回呼方法。例如,您可以將比較兩個對象的方法參考傳遞至排序算法。分開撰寫比較程序代碼,可讓您撰寫更適合通用的算法。

委派有下列屬性:

a.委派與 C++ 函式指標類似,但為型別安全。

b.委派允許將方法當做參數傳遞。

c.委派可用於定義回呼方法。

d.您可將委派鏈接在一起,例如,可在單一事件上呼叫多個方法。

123.C#中,執行以下代碼后S的結果:

string[] a=new string[7];

aa[0]="33";

aa[6]="66";

string s="";

foreach(string m in aa) s+=m;

3366
124.適配器datadapter的作用

表示 SQL 命令集和數據庫連接,用來填入 DataSet 並更新數據來源。

DataAdapter 是 DataSet 和數據來源之間的橋接器 (Bridge),用來擷取和儲存數據。DataAdapter 藉由對應 Fill (它會變更 DataSet 中的數據來符合數據來源中的數據) 和 Update (它會變更數據來源中的數據來符合 DataSet中的數據) 來提供這個橋接器。

125.所有類中最頂層的類是哪個類

System.Object
126.跳轉頁面有哪幾種方式?

 Response.Redirect("");

 Server.Transfer("");

Server.Execute("");
127.類包含哪些成員

1.建構函式 2.解構函式 3.常數 4.字段 5.方法 6.屬性 7.索引子 8.運算子 9.事件 10.委派

11.類別 12.界面 13.結構

128.索引器

索引子 (Indexer) 允許使用與數組相同的方式來索引類別或結構的執行個體。索引子除了其存取子需要使用參數以外,其余特性都與屬性相似。

a.索引子讓對象能以類似數組的方式來索引。

b.get 存取子會傳回一個值。set 存取子會指定一個值。

c.this 關鍵詞的用途為定義索引子。

d.value 關鍵詞是用來定義 set 索引子所指定的值。

e.索引子不需要以整數值來索引;您可以決定如何定義特定的查詢機制。

f.索引子可以多載。

g.索引子可以具有一個以上的型式參數,例如,在存取二維數組時便是如此。

class SampleCollection<T>

{

    private T[] arr = new T[100];

    public T this[int i]

    {

        get

        {

            return arr[i];

        }

        set

        {

            arr[i] = value;

        }

    }

}
129. HYPERLINK  linkbotton控件的差別

HYPERLINK導航。

使用 LinkButton 控件,在 Web 網頁上建立超級鏈接樣式按鈕。LinkButton 控件具有與 HyperLink 控件相同的外觀,但擁有與 Button 控件相同的功能。

130.DataReaderDataset有什么區別?

執行查詢時會傳回結果,並一直儲存於客戶端上的網絡緩沖區中,直至您使用 DataReader 的 Read 方法要求它們為止。使用 DataReader 可以提高應用程序的效能,方法是立即擷取可用的數據,及 (依預設) 一 次只將一個數據列儲存到內存中,從而減少系統負荷

 DataSet 是以常駐內存表示的數據,不論內含數據來源為何,都可提供一致的關系型程序設計模型。DataSet 表示一組完整的數據,包括內含、排序和約束數據的數據表,以及數據表間的關聯性。

131.簡要說出privateprotected的區別

private 存取只限於包含類別。

protected 存取只限於包含的類別或衍生自包含類別的型別。
132. 說出下面幾個函數的區別:

private void test(string str){…}

private void test(ref string str){…}

private void test(out string str){…}

out 關鍵詞會導致以傳址 (By Reference) 方式傳遞自變量。這點與 ref 關鍵詞相類似,除了 ref 需要在傳遞變量之前先初始化變量以外。若要使用 out 參數,方法定義和呼叫方法都必須明確使用 out 關鍵詞。

133.寫代碼:取得服務器時間並顯示(彈出消息框即可),要求完全在服務器端實現(提示:在C#中使用

Response.Write()方法)

Response.Write("<script >alert('當前時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')</script>");

134.說出下面各處正確或錯誤的理由(寫在該行)

class Test

{

int x;

static int y;

void F() {

x = 1; //ok

y = 1; //ok

}

static void G() {

x = 1; //error 非靜態成員不能在靜態

y = 1; //ok

}

static void Main() {

Test t = new Test();

t .x = 1; // Ok

t .y = 1; // Error

Test.x = 1; // Error

Test.y = 1; // Ok

}

}

135.簡要的談談你對多態的理解,並簡單的實現一個多態的例子 
136.下面關於索引的描述中。哪些是正確的?(AB 

A、索引能夠加快查詢的速度

B、索引可能會降低數值的更新速度

C、應該盡可能多的為表建立索引

137.請描述一下在.netForms認證模式下,怎樣用代碼(用戶名單存在數據庫中,而不是WebConfig中)

實現一個基於角色的授權?
138.Vs.net中,怎樣配置數據庫連接,可以使開發環境到應用環境遷移數據庫時不修改程序?

Machine.config

139.假設有一個數據庫字段name,需要在網頁中只顯示該字段的姓,而隱藏名字,類似“張**”形式,請寫

出數據綁定的自定義表達式。
140.請簡單描述一下制作一個用戶控件(UserControl)的過程。
141.您有沒有制作過自定義的webcontrol(注意不是用戶控件)?如果有,請描述一下自定義控件制作基本

過程,主要重載哪些方法?。
142.請描述構成ADO.net的主要對象以及他們的作用。
143.你編寫一段程序來判斷服務器請求是get,還是post請求?

string mm=Request.ServerVariables["REQUEST_METHOD"];

    string ll = Request.ServerVariables["QUERY_STRING"];
144.如果需記錄類的實例個數,該如何實現,請寫一個簡單的類於以證明.

public class TestA

    {

        public static int Count;

        public TestA()

        {

            Count = Count + 1;

        }

        public int CountA

        {

            get { return Count; }

        }

    }

 

TestA testa = new TestA();

            TestA testb = new TestA();

            TestA testb1 = new TestA();

            TestA testb2 = new TestA();

            TestA testb3 = new TestA();

            TestA testb4 = new TestA();

            TestA testb5 = new TestA();

            Console.Write(testb.CountA);
145.是否了解 URL Rewrite?請簡要說明其原理和在 ASP.NET 中的實現方式。

URL 重寫是截取傳入 Web 請求並自動將請求重定向到其他 URL 的過程.
146. ASP.NET 中如何調用 Web Service 的方法?

添加引用

        TestService.Service ts = new TestService.Service();

        DataSet ds = ts.GetUserInfo("", "");

     Response.Write(ds.Tables[0].Rows.Count);
147.ViewState 的作用和實現方式?

ViewState 屬性提供 Dictionary 對象來保留對相同網頁的多個要求之間的值。這是網頁用來在來回往返之間保留網頁和控件屬性值的預設方法。處理網頁時,網頁目前的狀態和控件會雜湊至字符串中,並且儲存在網頁中當做一個隱藏字段,或是如果儲存在 ViewState 屬性的數據量超過 MaxPageStateFieldLength 屬性中指定的值時,則會當做多個隱藏字段。網頁回傳到服務器時,網頁會在網頁初始化時剖析檢視狀態字符串,並且還原網頁中的屬性資

148.如何實現頁面分段緩存?

頁面分段緩存

頁面分段緩存是用用戶控件實現的。通過為頁面每個區域創建單獨的用戶控件來定義頁面的區域。在每個用戶控件中,可以使用Output-Cache指令指出如何緩存控件的輸出。

注意:

1、注意分段緩存不支持Location特性;緩存頁面分段惟一合法的地方是web服務器。這是因為分段緩存在ASP.NET中是新的功能,所以瀏覽器和代理服務器不支持。

2、分段緩存有另外一個在頁面緩存中沒有的特性——VaryByControl。VaryByControl特性允許指定一個由分號分隔的字符串列表,代表用戶控件內使用的控件的名稱;ASP.NET將針對值的每個不同的組合生成用戶構件的一個緩存版本。

頁面分段緩存的限制

1、如果為用戶控件啟用了緩存,就不能在包含它的頁面中通過程序訪問此控件了;

   例如:ctlContents.Message = "Hello!"

2、不應該對緩存的用戶控件使用數據綁定語法;

   不允許:<myControls:PageContents CategoryID='<%# CategoryID%>' Runat='Server'/> 會產生一個錯誤信息; 允許: <myControls:PageContents CategoryID='2' Runat='Server'/>  

149.你是否知道下列名字:.NET Pet ShopIBuySpy StoreDotNetNukeNUnitData Access Application

 Block?說說它們分別都是什么。 
150.如何實現XML系列化(給出簡單的代碼示例)

XML 序列化只會將對象的公用字段和屬性值序列化為 XML 數據流。

XML 序列化不會轉換方法、索引子、私用字段或只讀屬性 (只讀集合則除外)。若要序列化對象的所有字段和屬性 (包括公用和私用的),請使用 BinaryFormatter,而不要使用 XML 序列化。

public class TestXML

    {

        public string UserName;

        public string Address;

        public string Company;

        public string Description;

    }

XmlSerializer serializer =

            new XmlSerializer(typeof(TestXML));

        string FilePath = Server.MapPath("XML/woody.xml");

        TestXML tx = new TestXML();

        tx.Address = "MITC";

        tx.Company = "MDS";

        tx.Description = "WOODY";

        tx.UserName = "WU";

        Stream writer = new FileStream(FilePath, FileMode.Create);

        serializer.Serialize(writer, tx);

        writer.Close();

151.你知道 AJAX 嗎?說說它的特點和一般實現方式 
152.寫出一段利用XMLHTTP工作的簡單代碼 
153.如何定義嵌套的CSS樣式類

table.hover {     background-color: white; border-right:1px solid #f1f1f1 }
154..NET Remoting的工作原理是什么?請簡要地寫出一個.NET Remoting的示例

分布式處理方式,在Windows操作系統中,是將應用程序分離為單獨的進程。這個進程形成了應用程序代碼和數據周圍的一道邊界。如果不采用進程間通信(RPC)機制,則在一個進程中執行的代碼就不能訪問另一進程。這是一種操作系統對應用程序的保護機制。然而在某些情況下,我們需要跨過應用程序域,與另外的應用程序域進行通信,即穿越邊界.

Remoting的通道主要有兩種:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定義了IChannel接口。IChannel接口包括了TcpChannel通道類型和Http通道類型。它們分別對應Remoting通道的這兩種類型。

TcpChannel類型放在名字空間System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基於Socket的傳輸工具,使用Tcp協議來跨越Remoting邊界傳輸序列化的消息流。TcpChannel類型默認使用二進制格式序列化消息對象,因此它具有更高的傳輸性能。HttpChannel類型放在名字空間System.Runtime.Remoting.Channel.Http中。它提供了一種使用Http協議,使其能在Internet上穿越防火牆傳輸序列化消息流。默認情況下,HttpChannel類型使用Soap格式序列化消息對象,因此它具有更好的互操作性。通常在局域網內,我們更多地使用TcpChannel;如果要穿越防火牆,則使用HttpChannel.

155.從程序請求遠程http站點,有哪些可用的類?

WebRequest request = WebRequest.Create(PageUrl);

        WebResponse response = request.GetResponse();

        Stream resStream = response.GetResponseStream();

        StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);

        string KK = sr.ReadToEnd();

        resStream.Close();

        sr.Close();
156.對於Web Services,.NET Remoting,MSMQ,Enterprise Services這四個中接觸過多少?能否簡要的介紹

他們的特點

157.可否簡要的介紹asp.net 2.0 Membership,WebPartC#的匿名函數和泛型,希望可以簡要地闡述其中

的特點

Membership:

Membership 類別是用在 ASP.NET 應用程序中,以驗證使用者認證,並管理使用者設定,例如密碼和電子郵件地址。Membership 類別可以單獨使用,也可以結合 FormsAuthentication 使用,以建立驗證 Web 應用程序或網站使用者的完整系統。Login 控件會封裝 Membership 類別,以提供驗證使用者的便利機制。

Membership 類別提供多項功能,以供進行:建立新使用者。

將成員資格信息 (使用者名稱、密碼、電子郵件地址,以及支持數據) 存放於 Microsoft SQL Server 或替代數據存放區中。

驗證造訪您網站的使用者。您可以透過程序設計方式驗證使用者,您也可以使用 Login 控件,建立需要少數或不需要程序代碼的完整驗證系統。

管理密碼,其中包括建立、變更、擷取,及重設等動作。您也可以選擇設定 ASP.NET 成員資格,向遺忘密碼的使用者要求密碼問題和解答,以驗證密碼重設或擷取要求。

 

WebPart:

ASP.NET Web 組件是用於建立網站的整合式控件集合,可讓使用者直接從瀏覽器修改 Web 網頁的內容、外觀和行為。這些修改可以套用至網站上的所有使用者或個別使用者。當使用者修改頁面和控件時,可以儲存這些設定,以保留使用者的個人偏好設定,在未來的瀏覽器工作階段 (Session) 使用,這個功能稱為個人化。這些 Web 組件能力讓開發人員可以授權使用者動態地個人化 Web 應用程序,而不需要開發人員或管理員介入。

藉由使用 Web 組件控件集合,開發人員可讓使用者執行下列功能:

個人化頁面內容。使用者可以將新的 Web 組件控件加入至頁面,或是移除、隱藏或最小化控件,如同使用普通窗口一樣。

個人化頁面配置。使用者可以將 Web 組件控件拖曳至頁面上的不同區域,或變更其外觀、屬性和行為。

匯出和匯入控件。使用者可以匯入或匯出 Web 組件控件設定以用於其它頁面或網站,並保留控件中的屬性、外觀或甚至數據,如此可讓使用者減少數據輸入和組態設定的需要。

建立連接。使用者可以在控件間建立連接,例如,圖表控件可以將股票行情實時廣告牌控件中的數據顯示為圖表。使用者不但能個人化連接本身,也能個人化圖表控件顯示數據之外觀和細節的方式。

管理和個人化網站層級設定。授權的使用者可以設定網站層級設定,決定誰可以存取網站或網頁,以及設用者共享,並防止不是管理員的使用者個人化共享的控件。

與區域變量不同的是,外部變量的存留期會延續,直到參考匿名方法的委派可進行內存回收為止。n 的參考是在建立委派時所擷取。

 

匿名方法:

將程序代碼區塊當做委派參數傳遞的一種方式

藉由使用匿名方法,您無須另外建立方法,因而可以減少在執行個體化委派時所需要另外撰寫的程序代碼。

匿名方法不能存取外部范圍的 ref 或 out 參數。

anonymous-method-block 內不能存取 Unsafe 程序代碼。

button1.Click += delegate(System.Object o, System.EventArgs e)

                   { System.Windows.Forms.MessageBox.Show("Click!"); };

泛型:

泛型是指一些類別、結構、接口和方法,而它們具有其儲存或使用的一或多個型別之替代符號 (型別參數)。泛型集合類別可能會將型別參數當做它所儲存的對象型別之替代符號;這些型別參數會以其字段型別及其方法的參數型別之形式出現。泛型方法可能會將它的型別參數當做其傳回值的型別或是其中一個正規參數的型別使用。

System.Collections.Generic 和 System.Collections.ObjectModel 命名空間中的泛型集合類別 
158.如何理解責任鏈和命令模式的異同?

159.數據量下的列表顯示分頁如何處理? 
160.附件上傳后的保存方式以及如何瀏覽?

string FileVName = DateTime.Now.ToString("yyyyMMddHHmm") + WebCom.RandomnAlpha(7) + fileExt;

 file_up_load.PostedFile.SaveAs(loadFilePath + FileVName);
161.面向對象中的基類指什么,什么時候用到基類 
162.存儲過程跟SQL語句比較,各有什么優點和缺點? 
163.描述怎樣區分使用ExecuteNonQueryExecuteScalar方法?

ExecuteNonQuery:

使用 ExecuteNonQuery 以執行數據庫目錄 (Catalog) 作業 (例如,查詢數據庫結構或建立如數據表的數據庫對象),或藉由執行 UPDATE、INSERT 或 DELETE 陳述式變更數據庫的數據。

雖然 ExecuteNonQuery 不傳回任何數據列,但是對應至參數的任何輸出參數或傳回值會填入 (Populate) 資料。對 UPDATE、INSERT 和 DELETE 陳述式而言,傳回值是受命令影響的數據列數目。對其他類型的陳述式而言,傳回值為-1。

ExecuteScalar:

執行查詢,並傳回查詢所傳回的結果集中第一個數據列的第一個資料行。會忽略所有其它的數據行和數據列。  

164.SQL語句中是否用過Sum,Count,Top,Group By,Case...When這些關鍵字,請描述具體用法?

Sum加總;Count:記錄總數; Top:前多少條; Group By集合函數; Case...When條件語句
165.是否用過Xml Schema或者DTD,怎樣使用一個Xml Schema或者DTD去校驗一個xml的格式是否正確?

   XmlTextReader tr = new XmlTextReader(Server.MapPath("XML/woody.xml"));

        XmlValidatingReader vr = new XmlValidatingReader(tr);

        vr.ValidationType = ValidationType.DTD;

        vr.ValidationEventHandler += new ValidationEventHandler(ValidationHandler);

        while (vr.Read()) ; 
166.是否使用過Xsl樣式表?解釋xsl:apply-templatesxsl:call-templatexsl:choosexsl:value-of

的用法?

XSL 之於 XML ,就像 CSS 之於 HTML。它是指可擴展樣式表語言 (EXtensible Stylesheet Language)。這是一種用於以可讀格式呈現 XML 數據的語言。XSL 實際上包含兩個部分:

* XSLT – 用於轉換 XML 文檔的語言

*XPath – 用於在 XML 文檔中導航的語言

XSLT 是指 XSL 轉換 (XSL Transformation),它是 XSL 最重要的部分。

XSLT 可以將 XML 文檔轉換為其它 XML 文檔、XHTML 輸出或簡單的文本。這通常是通過將每個 XML 元素轉換為 HTML 元素來完成的。由於 XML 標簽是用戶定義的,瀏覽器不知道如何解釋或呈現每個標簽,因此必須使用 XSL。XML 標簽的意義是為了方便用戶(而不是計算機)理解。

XSLT 還可以對 XML 樹進行下列操作:

* 添加和刪除元素

* 添加和刪除屬性

* 對元素進行重新排列或排序

* 隱藏或顯示某些元素

* 查找或選擇特定元素

XSL 語法

您可能還記得 XML 概述文章中提到過,所有 XML 文檔都是以 XML 聲明開頭。XSL 樣式表也是一樣。任何 XSL 文檔的第一行實際上都是 XML 聲明:

<?xml version="1.0" encoding="ISO-8859-1"?>

XSL 是否與 XML 相同?

既是又不是。說是,是因為它們遵循相同的語法規則(只有少許差異,下面我將會講到)。說不是,是因為它們的用途不同:XML 用於承載數據,而 XSL 則用於設置數據的格式。

在 XML 聲明之后,就是 XSL 聲明,例如:

<xsl:stylesheet>或<xsl:transform>

但是,在大多數實際情況下,XSL 聲明看起來要稍微復雜一些:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

這是因為,根據 W3C 聯盟的建議,它還包含命名空間和 XSL 規范的版本。

XSL 聲明與 XML 聲明的不同之處在於,XML 聲明只寫一行,而且沒有結束標簽,而 XSL 聲明必須包含結束標簽,該標簽表示 XSL 樣式表結束:

</xsl:stylesheet>

請注意,這並不與 XML 語法規則沖突:XSL 樣式表是完全有效的 XML 文檔,因為它有一個根元素,由 <xsl:stylesheet> 標簽指定。

在什么情況下應該使用 XSL?

XSL 在設計時有幾個目標用途,這些用途使它成為某些開發情況下的完美解決方案,而對另一些開發情況則毫無用處。

XSL 專門用於處理 XML 文檔,並且遵循 XML 語法。因此,它只能在支持 XML 的應用程序中與 XML 結合使用。最合適使用 XML 和 XSL 的情況是:Web 門戶、新聞聚合器、社區網站或其它任何需要向各種設備及大 量   客戶端提供信息的 Web 應用程序。

XSLT 是一種基於模式匹配的語言。它會查找匹配特定條件的節點,然后應用相應的規則。因此,它不具備大多數編程語言的計算能力。例如,XSL 無法在運行時更改變量的值。它不應該用於從使用復雜公式的動態數據源(例如在線商店)來計算值。Web 編程語言更適於此用途。

XSL 不能代替或補充 CSS。它不應(也不能)用於設置 HTML 的樣式。但是,您可以將其用於需要頻繁重新設計可視化效果、頻繁更換布局以及以靈活格式處理數據的網站。

XSL 不是內容管理工具。它不應(也不能)用於更改 XML 文檔的內容或者編輯信息。但是,您可以將 XML 和 XSL 用於需要處理幾種不同格式文檔的內容管理系統。

167講一講你理解的web service,dot net framework中,怎么很好的結合xml(講概念就行了)

168.C#實現以下功能

   a 產生一個int數組,長度為100,並向其中隨機插入1-100,並且不能重復。

   b 對上面生成的數組排序,需要支持升序、降序兩種順序

169.需要實現對一個字符串的處理,首先將該字符串首尾的空格去掉,如果字符串中間還有連續空格的話,

保留一個空格,即允許字符串中間有多個空格,但連續的空格數不可超過一個.

FilterStr = Regex.Replace(FilterStr, "[\\s]{2,}", " ");

170.設有關系框架R(A,B,C,D)及其上的函數相關性集合F={BA,BCD},那么關系框架R最高是....................(a) 
a. 第一范式的
b. 第二范式的
c. 第三范式的
d. BCNF范式的

172.設有關系EMPENOENAMESALARYDNO ),其中各屬性的含義依次為職工號、姓名、工資和所在部門號,以及關系DEPTDNODNAMEMANAGER),其中各屬性含義依次為部門號、部門名稱、部門經理的職工號。試用SQL語句完成以下查詢:

a) 列出各部門中工資不低於600元的職工的平均工資。
select dno , avg(salary) as average from emp where salary>=600 group by dno

b) 查詢001號職工所在部門名稱。
select DNAME from dept where DNO = (select DNO from emp where eno=’001’) 
或者
select d.dname from dept as d left jon emp as e on e.dno = d.dno where e.eno=’001’

c)請用SQL語句將“銷售部”的那些工資數額低於600的職工的工資上調10%。
update EMP set SALARY =SALARY*(1+0.1) where SALARY<600 and DNO = ( select DNO from dept where dname= ‘銷售部’ )

173程序補充

using System;

class Point

{

     public int x,y,z;

     public Point()

     {

         x = 0;

y = 0;

z = 0;

     }

     public Point(int x, int y,int z)

     {

         this.x=x;

         this.y=y;

         this.Z=y;

     }

     public override string ToString()

     {

         return(String.Format("({0},{1},{2})", x, y,z));

     }

}

class MainClass

{

     static void Main()

     {

         Point p1 = new Point();

         Point p2 = new Point(10,20,30);

         Console.WriteLine("三維中各點坐標:");

         Console.WriteLine("點1的坐標為{0}", p1);

         Console.WriteLine("點2的坐標為{0}", p2);

     }

}

 

174.   程序填空

using System;

class SwitchTest

{

     public static void Main() 

     {

         Console.WriteLine("郵箱種類: 1:免費郵箱 2:企業郵箱 3:VIP郵箱");

         Console.Write("請輸入您的選擇: ");

         string s = Console.ReadLine();

         int n = int.Parse(s);

         int cost = 0;

         switch(n)      

         {        

              case 0:        

              case 1:  

<!--把cost賦值為0-->                          
cost = 0;

Break;

              case 2:           

<!--把cost賦值為100-->                     
cost = 100;

Break;

              case 3:           

<!--把cost賦值為300-->                 
cost = 300;

Break;

              default:           

                   Console.WriteLine("錯誤的選擇.請輸入1, 2,或者3.");           

                   Break;

         }

         if (cost != 0)

              Console.WriteLine("您選擇的郵箱每年的費用為{0}元.", cost);

     }

}

175設計模式

我們公司有很多產品,有些產品比較早,設計上不是非常完善。現在我們有一個系統整合了其它產品的身份認證,即其它產品的身份認證全部由該系統完成。現在的問題是,由於各個系統采用的密碼加密算法不一致(都是不可逆算法),請你選擇合適的設計模式,完成密碼校驗的功能。

176裝箱、拆箱操作發生在: ( C )

A.類與對象之間      B.對象與對象之間

C.引用類型與值類型之間   D.引用類型與引用類型之間
177用戶類若想支持Foreach語句需要實現的接口是: (   AB )

 A.IEnumerable   B.Ienumerator

C.ICollection   D.ICollectData
178 .Net Framework通過什么與COM組件進行交互操作?(  C  )

A.Side By Side   B.Web Service

C.Interop    D.PInvoke
179裝箱與拆箱操作是否是互逆的操作?(   B )

 A.是     B.否
180以下哪個是可以變長的數組?(  BD  )

A.Array    B.string[]

C.string[N]   D.ArrayList
181用戶自定義異常類需要從以下哪個類繼承:A   )

A.Exception     B.CustomException

C.ApplicationException  D.BaseException
182以下代碼段中能否編譯通過?請給出理由。

Try

{

}

catch(FileNotFoundException e1)

{

}

catch(Exception e2)

{

}

catch(IOException e3)

{

}

Catch

{

}

不可以,

IOException繼承於Exception

之前的 catch 子句已經取得所有屬於此類別或超級類別 ('System.Exception') 的例外狀況

183對於一個實現了IDisposable接口的類,以下哪些項可以執行與釋放或重置非托管資源相關的應用程序定義的任務?(多選) (    bcd       )

A.Close   B.Dispose   C.Finalize

D.using   E.Quit
184. .Net依賴以下哪項技術實現跨語言互用性?C   )

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

185請問: String類與StringBuilder類有什么區別?為什么在.Net類庫中要同時存在這2個類?

  String 或 StringBuilder 對象之串連作業的效能是根據內存的配置頻率而定。String 串連作業永遠都會配置內存,而 StringBuilder 串連作業只有在 StringBuilder 對象緩沖區太小而無法容納新數據時,才會配置內存。因此,如果要串連固定數目的 String 對象,最好使用 String 類別的串連作業。在這種情況下,編譯器甚至可能將個別的串連作業結合成一個單一作業。如果要串連任意數目的字符串 (例如,如果循環串連任意數目的使用者輸入字符串),則對於串連作業來說最好使用 StringBuilder 對象。

186以下哪個類是int的基類?B  )

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

187以下哪些可以作為接口成員?(多選) (   ABD     )

A.方法  B.屬性  C.字段  D.事件  E.索引器F.構造函數  G.析構函數
188以下關於refout的描述哪些項是正確的?(多選) (    AC    )

A.使用ref參數,傳遞到ref參數的參數必須最先初始化。

B.使用out參數,傳遞到out參數的參數必須最先初始化。

C.使用ref參數,必須將參數作為ref參數顯式傳遞到方法。

D.使用out參數,必須將參數作為out參數顯式傳遞到方法。
189.“訪問范圍限定於此程序或那些由它所屬的類派生的類型”是對以下哪個成員可訪問性含義的正確描述(   B  )

 A.public B.protected  C.internal  D.protected internal
190.class Class1

{

    private static int count = 0;

    static Class1()

    {

        count++;

    }

    public Class1()

    {

        count++;

    }

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

請問,o1.Count的值是多少?(  B  )

 A.1   B.2   C.3   D.4
191. abstract class BaseClass

{

    public virtual void MethodA()

    {

    }

    public virtual void MethodB()

    {

    }

}

class Class1: BaseClass

{

    public void MethodA(string arg)

    {

    }

    public override void MethodB()

    {

    }

}

class Class2: Class1

{

    new public void MethodB()

    {

    }

}

class MainClass

{

    public static void Main(string[] args)

    {   

     Class2 o = new Class2();

        Console.WriteLine(o.MethodA());

    }

}

請問,o.MethodA調用的是: (  A  )

A.BaseClass.MethodA   B.Class2.MethodA

C.Class1.MethodA    D.都不是

192您需要創建一個ASP.NET應用程序,公司考慮使用Windows身份認證。所有的用戶都存在於AllWin這個域中。您想要使用下列認證規則來配置這個應用程序:

1.匿名用戶不允許訪問這個應用程序。

2.所有雇員除了Tess和King都允許訪問這個應用程序。

請問您應該使用以下哪一個代碼段來配置這個應用程序?(    )

A.      <authorization>

B.      <deny users=”allwin"tess, allwin"king”>
<allow users=”*”>
<deny users=””>
</authorization>

C.      <authorization>
<deny users=”allwin"tess, allwin"king”>
<deny users=””>
<allow users=”*”>
</authorization>

D.      <authorization>
<allow users=”allwin"tess, allwin"king”>
<allow users=”*”>
</authorization>

E.      <authorization>
<allow users=”*”>
<deny users=”allwin"tess, allwin"king”>
</authorization>

193要創建一個顯示公司員工列表的應用程序。您使用一個DataGrid控件顯示員工的列表。您打算修改這個控件以便在這個GridFooter顯示員工合計數。請問您應該怎么做?(  BC)

A.重寫OnPreRender事件,當Grid的Footer行被創建時顯示合計數。

B.重寫OnItemCreated事件,當Grid的Footer行被創建時顯示合計數。

C.重寫OnItemDataBound事件,當Grid的Footer行被創建時顯示合計數。

D.重寫OnLayout事件,當Grid的Footer行被創建時顯示合計數。
194.創建ASP.NET應用程序用於運行AllWin公司內部的Web站點,這個應用程序包含了50個頁面。

您想要配置這個應用程序以便當發生一個HTTP代碼錯誤時它可以顯示一個自定義的錯誤頁面給用戶。

您想要花最小的代價完成這些目標,您應該怎么做?(多選)(  AD)

A.在這個應用程序的Global.asax文件中創建一個Application_Error過程去處理ASP.NET代碼錯誤。

B.在這個應用程序的Web.config文件中創建一個applicationError節去處理ASP.NET代碼錯誤。

C.在這個應用程序的Global.asax文件中創建一個CustomErrors事件去處理HTTP錯誤。

D.在這個應用程序的Web.config文件中創建一個CustomErrors節去處理HTTP錯誤。

E.在這個應用程序的每一頁中添加一個Page指示符去處理ASP.NET 代碼錯誤。

F. 在這個應用程序的每一頁中添加一個Page指示符去處理ASP.NET HTTP錯誤。

195您為AllWin公司創建了一個ASP.NET應用程序。這個應用程序調用一個Xml Web Service。這個Xml Web Service將返回一個包含了公司雇員列表的DataSet對象。請問您該如何在這個程序中使用這個Xml Web Service(  b )

A.在“引用”對話框的.Net標簽中選擇System.Web.Services.dll。

B.在“Web引用”對話框中輸入這個XML Web service的地址。

C.在您的Global.asax.cs中添加一條using語句並指定這個XML Web service的地址。

D.在您的Global.asax.cs中寫一個事件處理器導入這個Xml Web Service相應的.wsdl和.disco文件。   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C sharp面試模擬題基於MSDN的回答

 

1、請解釋在new override 的區別?

new 運算符用於在堆上創建對象和調用構造函數。

new 運算符用於創建對象和調用構造函數。

new 修飾符 用於隱藏基類成員的繼承成員。

使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,並用 new 修飾符修飾它。

通過繼承隱藏名稱采用下列形式之一:

引入類或結構中的常數、指定、屬性或類型隱藏具有相同名稱的所有基類成員。

引入類或結構中的方法隱藏基類中具有相同名稱的屬性、字段和類型。同時也隱藏具有相同簽名的所有基類方法。

引入類或結構中的索引器將隱藏具有相同名稱的所有基類索引器。

在同一成員上同時使用 new 和 override 是錯誤的。

在不隱藏繼承成員的聲明中使用 new 修飾符將生成警告。

使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。

不能重寫非虛方法或靜態方法。重寫基方法必須是虛擬的、抽象的或重寫的。

重寫聲明不能更改虛方法的可訪問性。重寫方法和虛方法必須具有相同的訪問級修飾符。

不能使用下列修飾符修改重寫方法:new   static    virtual   abstract重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,並且重寫屬性必須是虛擬的、抽象的或重寫的。

2.請解釋virtual的含義?

virtual 關鍵字用於修改方法或屬性的聲明,在這種情況下,方法或屬性被稱作虛擬成員。虛擬成員的實現可由派生類中的重寫成員更改。調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部分派生類中的該重寫成員,如果沒有派生類重寫該成員,則它可能是原始成員。默認情況下,方法是非虛擬的。不能重寫非虛方法。不能將 virtual 修飾符與以下修飾符一起使用:static   abstract   override除了聲明和調用語法不同外,虛擬屬性的行為與抽象方法一樣。在靜態屬性上使用 virtual 修飾符是錯誤的。通過包括使用 override 修飾符的屬性聲明,可在派生類中重寫虛擬繼承屬性。

3.請解釋.net采用委托實現的事件模型與JAVA中采用接口實現的事件模型有什么區別,以圖示方式解釋。

事件是對象發送的消息,以發信號通知操作的發生。操作可能是由用戶交互(例如鼠標單擊)引起的,也可能是由某些其他的程序邏輯觸發的。引發(觸發)事件的對象叫做事件發送方。捕獲事件並對其作出響應的對象叫做事件接收方。

在事件通信中,事件發送方類不知道哪個對象或方法將接收到(處理)它引發的事件。所需要的是在源和接收方之間存在一個媒介(或類似指針的機制)。.NET Framework 定義了一個特殊的類型(Delegate),該類型提供函數指針的功能。

委托是一個可以對方法進行引用的類。與其他的類不同,委托類具有一個簽名,並且它只能對與其簽名匹配的方法進行引用。這樣,委托就等效於一個類型安全函數指針或一個回調。這里只討論委托的事件處理功能。

觀察者模式(Observer)是對象的行為模式,又稱:

發布-訂閱模(ublish/Subscribe)源-監聽器 Source/Listener)

•觀察者模式定義了一個一對多的依賴關系,讓一個或多個觀察者對象監察一個主題對象。

•這樣一個主題對象在狀態上的變化能夠通知所有的依賴於此對象的那些觀察者對象,使這些觀察者對象能夠自動更新

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.請解釋接口的顯式實現有什么意義?

接口可以有靜態成員、嵌套類型、抽象、虛擬成員、屬性和事件。實現接口的任何類都必須提供接口中所聲明的抽象成員的定義。接口可以要求任何實現類必須實現一個或多個其他接口。

對接口有以下限制:

接口可以用任何可訪問性來聲明,但接口成員必須全都具有公共可訪問性。

不能向成員或接口自身附加安全性限制。

接口可以定義類構造函數,但不能定義實例構造函數。

每種語言都必須為需要成員的接口映射一個實現提供規則,因為不只一個接口可以用相同的簽名聲明成員,且這些成員可以有單獨的實現。

為了實現接口,類或結構可以聲明“顯式接口成員實現”。顯式接口成員實現就是一種方法、屬性、事件或索引器聲明,它使用完全限定接口成員名稱作為標識符。

某些情況下,接口成員的名稱對於實現該接口的類可能是不適當的,此時,可以使用顯式接口成員實現來實現該接口成員。例如,一個用於“文件抽象”的類一般會實現一個具有釋放文件資源作用的 Close 成員函數,同時還可能使用顯式接口成員實現來實現接口的方法

在方法調用、屬性訪問或索引器訪問中,不能直接訪問“顯式接口成員實現”的成員,即使用它的完全限定名也不行。“顯式接口成員實現”的成員只能通過接口實例訪問,並且在通過接口實例訪問時,只能用該接口成員的簡單名稱來引用。

顯式接口成員實現中包含訪問修飾符屬於編譯時錯誤,而且如果包含 abstractvirtualoverride 或 static 修飾符也屬於編譯時錯誤。

顯式接口成員實現具有與其他成員不同的可訪問性特征。由於顯式接口成員實現永遠不能在方法調用或屬性訪問中通過它們的完全限定名來訪問,因此,它們似乎是 private(私有的)。但是,因為它們可以通過接口實例來訪問,所以它們似乎又是 public(公共的)。

顯式接口成員實現有兩個主要用途:

由於顯式接口成員實現不能通過類或結構實例來訪問,因此它們就不屬於類或結構的自身的公共接口。當需在一個公用的類或結構中實現一些僅供內部使用(不允許外界訪問)的接口時,這就特別有用。

顯式接口成員實現可以消除因同時含有多個相同簽名的接口成員所引起的多義性。如果沒有顯式接口成員實現,一個類或結構就不可能為具有相同簽名和返回類型的接口成員分別提供相應的實現,也不可能為具有相同簽名和不同返回類型的所有接口成員中的任何一個提供實現。

為了使顯式接口成員實現有效,聲明它的類或結構必須在它的基類列表中指定一個接口,而該接口必須包含一個成員,該成員的完全限定名、類型和參數類型與該顯式接口成員實現所具有的完全相同。

請以圖示方式解釋性 .net framework?

.NET Framework 是一種新的計算平台,它簡化了在高度分布式 Internet 環境中的應用程序開發。.NET Framework 旨在實現下列目標:

  • 提供一個一致的面向對象的編程環境,而無論對象代碼是在本地存儲和執行,還是在本地執行但在 Internet 上分布,或者是在遠程執行的。
  • 提供一個將軟件部署和版本控制沖突最小化的代碼執行環境。
  • 提供一個保證代碼(包括由未知的或不完全受信任的第三方創建的代碼)安全執行的代碼執行環境。
  • 提供一個可消除腳本環境或解釋環境的性能問題的代碼執行環境。
  • 使開發人員的經驗在面對類型大不相同的應用程序(如基於 Windows 的應用程序和基於 Web 的應用程序)時保持一致。
  • 按照工業標准生成所有通信,以確保基於 .NET Framework 的代碼可與任何其他代碼集成。

.NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫。公共語言運行庫是 .NET Framework 的基礎。您可以將運行庫看作一個在執行時管理代碼的代理,它提供核心服務(如內存管理、線程管理和遠程處理),而且還強制實施嚴格的類型安全以及可確保安全性和可靠性的其他形式的代碼准確性。事實上,代碼管理的概念是運行庫的基本原則。以運行庫為目標的代碼稱為托管代碼,而不以運行庫為目標的代碼稱為非托管代碼。.NET Framework 的另一個主要組件是類庫,它是一個綜合性的面向對象的可重用類型集合,您可以使用它開發多種應用程序,這些應用程序包括傳統的命令行或圖形用戶界面 (GUI) 應用程序,也包括基於 ASP.NET 所提供的最新創新的應用程序(如 Web 窗體和 XML Web services)。

.NET Framework 可由非托管組件承載,這些組件將公共語言運行庫加載到它們的進程中並啟動托管代碼的執行,從而創建一個可以同時利用托管和非托管功能的軟件環境。.NET Framework 不但提供若干個運行庫宿主,而且還支持第三方運行庫宿主的開發。

例如,ASP.NET 承載運行庫以為托管代碼提供可伸縮的服務器端環境。ASP.NET 直接使用運行庫以啟用 ASP.NET 應用程序和 XML Web services(本主題稍后將對這兩者進行討論)。

Internet Explorer 是承載運行庫(以 MIME 類型擴展的形式)的非托管應用程序的一個示例。使用 Internet Explorer 承載運行庫使您能夠在 HTML 文檔中嵌入托管組件或 Windows 窗體控件。以這種方式承載運行庫使得托管移動代碼(類似於 Microsoft® ActiveX® 控件)成為可能,但是它具有只有托管代碼才能提供的重大改進(如不完全受信任的執行和安全的獨立文件存儲)。

下面的插圖顯示公共語言運行庫和類庫與應用程序之間以及與整個系統之間的關系。該插圖還顯示托管代碼如何在更大的結構內運行。

.NET Framework 環境

 

下面的章節將更加詳細地描述 .NET Framework 的主要組件和功能。

公共語言運行庫的功能

公共語言運行庫管理內存、線程執行、代碼執行、代碼安全驗證、編譯以及其他系統服務。這些功能是在公共語言運行庫上運行的托管代碼所固有的。

至於安全性,取決於包括托管組件的來源(如 Internet、企業網絡或本地計算機)在內的一些因素,托管組件被賦予不同程度的信任。這意味着即使用在同一活動應用程序中,托管組件既可能能夠執行文件訪問操作、注冊表訪問操作或其他須小心使用的功能,也可能不能夠執行這些功能。

運行庫強制實施代碼訪問安全。例如,用戶可以相信嵌入在 Web 頁中的可執行文件能夠在屏幕上播放動畫或唱歌,但不能訪問他們的個人數據、文件系統或網絡。這樣,運行庫的安全性功能就使通過 Internet 部署的合法軟件能夠具有特別豐富的功能。

運行庫還通過實現稱為通用類型系統 (CTS) 的嚴格類型驗證和代碼驗證基礎結構來加強代碼可靠性。CTS 確保所有托管代碼都是可以自我描述的。各種 Microsoft 和第三方語言編譯器生成符合 CTS 的托管代碼。這意味着托管代碼可在嚴格實施類型保真和類型安全的同時使用其他托管類型和實例。

此外,運行庫的托管環境還消除了許多常見的軟件問題。例如,運行庫自動處理對象布局並管理對對象的引用,在不再使用它們時將它們釋放。這種自動內存管理解決了兩個最常見的應用程序錯誤:內存泄漏和無效內存引用。

運行庫還提高了開發人員的工作效率。例如,程序員可以用他們選擇的開發語言編寫應用程序,卻仍能充分利用其他開發人員用其他語言編寫的運行庫、類庫和組件。任何選擇以運行庫為目標的編譯器供應商都可以這樣做。以 .NET Framework 為目標的語言編譯器使得用該語言編寫的現有代碼可以使用 .NET Framework 的功能,這大大減輕了現有應用程序的遷移過程的工作負擔。

盡管運行庫是為未來的軟件設計的,但是它也支持現在和以前的軟件。托管和非托管代碼之間的互操作性使開發人員能夠繼續使用所需的 COM 組件和 DLL。

運行庫旨在增強性能。盡管公共語言運行庫提供許多標准運行庫服務,但是它從不解釋托管代碼。一種稱為實時 (JIT) 編譯的功能使所有托管代碼能夠以它在其上執行的系統的本機語言運行。同時,內存管理器排除了出現零碎內存的可能性,並增大了內存引用區域以進一步提高性能。

最后,運行庫可由高性能的服務器端應用程序(如 Microsoft® SQL Server™ 和 Internet 信息服務 (IIS))承載。此基礎結構使您在享受支持運行庫宿主的行業最佳企業服務器的優越性能的同時,能夠使用托管代碼編寫業務邏輯。

.NET Framework 類庫

.NET Framework 類庫是一個與公共語言運行庫緊密集成的可重用的類型集合。該類庫是面向對象的,並提供您自己的托管代碼可從中導出功能的類型。這不但使 .NET Framework 類型易於使用,而且還減少了學習 .NET Framework 的新功能所需要的時間。此外,第三方組件可與 .NET Framework 中的類無縫集成。

例如,.NET Framework 集合類實現一組可用於開發您自己的集合類的接口。您的集合類將與 .NET Framework 中的類無縫地混合。

.NET Framework 類型使您能夠完成一系列常見編程任務(包括諸如字符串管理、數據收集、數據庫連接以及文件訪問等任務)。除這些常見任務之外,類庫還包括支持多種專用開發方案的類型。例如,可使用 .NET Framework 開發下列類型的應用程序和服務:

  • 控制台應用程序。
  • Windows GUI 應用程序(Windows 窗體)。
  • ASP.NET 應用程序。
  • XML Web services。
  • Windows 服務。

例如,Windows 窗體類是一組綜合性的可重用的類型,它們大大簡化了 Windows GUI 的開發。如果要編寫 ASP.NET Web 窗體應用程序,可使用 Web 窗體類。

客戶端應用程序開發

客戶端應用程序在基於 Windows 的編程中最接近於傳統風格的應用程序。這些是在桌面上顯示窗口或窗體從而使用戶能夠執行任務的應用程序類型。客戶端應用程序包括諸如字處理程序和電子表格等應用程序,還包括自定義的業務應用程序(如數據輸入工具、報告工具等等)。客戶端應用程序通常使用窗口、菜單、按鈕和其他 GUI 元素,並且它們可能訪問本地資源(如文件系統)和外圍設備(如打印機)。

另一種客戶端應用程序是作為 Web 頁通過 Internet 部署的傳統 ActiveX 控件(現在被托管 Windows 窗體控件所替代)。此應用程序非常類似於其他客戶端應用程序:它在本機執行,可以訪問本地資源,並包含圖形元素。

過去,開發人員將 C/C++ 與 Microsoft 基礎類 (MFC) 或應用程序快速開發 (RAD) 環境(如 Microsoft® Visual Basic®)一起使用來創建這樣的應用程序。.NET Framework 將這些現有產品的特點合並到了單個且一致的開發環境中,該環境大大簡化了客戶端應用程序的開發。

包含在 .NET Framework 中的 Windows 窗體類旨在用於 GUI 開發。您可以輕松創建具有適應多變的商業需求所需的靈活性的命令窗口、按鈕、菜單、工具欄和其他屏幕元素。

例如,.NET Framework 提供簡單的屬性以調整與窗體相關聯的可視屬性。某些情況下,基礎操作系統不支持直接更改這些屬性,而在這些情況下,.NET Framework 將自動重新創建窗體。這是 .NET Framework 集成開發人員接口從而使編碼更簡單更一致的許多方法之一。

和 ActiveX 控件不同,Windows 窗體控件具有對用戶計算機的不完全受信任的訪問權限。這意味着二進制代碼或在本機執行的代碼可訪問用戶系統上的某些資源,例如 GUI 元素和訪問受限制的文件,但這些代碼不能訪問或危害其他資源。由於具有代碼訪問安全性,許多曾經需要安裝在用戶系統上的應用程序現在可以通過 Web 安全地部署。您的應用程序可以在像 Web 頁那樣部署時實現本地應用程序的功能。

服務器應用程序開發

在托管領域中,服務器端應用程序是通過運行庫宿主實現的。非托管應用程序承載公共語言運行庫,后者使您的自定義托管代碼可以控制服務器的行為。此模型在獲得主服務器的性能和可伸縮性的同時提供給您公共語言運行庫和類庫的所有功能。

下面的插圖顯示在不同服務器環境中運行托管代碼的基本網絡架構。在應用程序邏輯通過托管代碼執行時,服務器(如 IIS 和 SQL Server)可執行標准操作。

服務器端托管代碼

ASP.NET 是使開發人員能夠使用 .NET Framework 開發基於 Web 的應用程序的宿主環境。但是,ASP.NET 不止是一個運行庫宿主;它是使用托管代碼開發 Web 站點和通過 Internet 分布的對象的完整結構。Web 窗體和 XML Web services 都將 IIS 和 ASP.NET 用作應用程序的發布機制,並且兩者在 .NET Framework 中都具有支持類集合。

XML Web services 作為基於 Web 的技術的重要發展,是類似於常見 Web 站點的分布式服務器端應用程序組件。但是,與基於 Web 的應用程序不同,XML Web services 組件不具有 UI 並且不以瀏覽器(如 Internet Explorer 和Netscape Navigator)為目標。XML Web services 由旨在供其他應用程序使用的可重用的軟件組件組成,所謂的其他應用程序包括:傳統的客戶端應用程序,基於 Web 的應用程序,甚至是其他 XML Web services。因此,XML Web services 技術正迅速地將應用程序開發和部署推向高度分布式 Internet 環境。

如果您使用過 ASP 技術的早期版本,很快就會注意到 ASP.NET 和 Web 窗體提供的改進。例如,您可以用支持 .NET Framework 的任何語言開發 Web 窗體頁。此外,您的代碼不再需要與 HTTP 文本共享同一個文件(盡管如果您願意,代碼還可以繼續這樣做)。Web 窗體頁用本機語言執行,這是因為與所有其他托管應用程序一樣,它們充分利用運行庫。與此相對照,非托管 ASP 頁始終被寫成腳本並解釋。ASP.NET 頁比非托管 ASP 頁更快、更實用並且更易於開發,這是因為它們像所有托管應用程序一樣與運行庫進行交互。

.NET Framework 還提供類和工具的集合來幫助開發和使用 XML Web services 應用程序。XML Web services 是基於 SOAP(一種遠程過程調用協議)、XML(一種可擴展的數據格式)和 WSDL(Web 服務描述語言)這些標准生成的。基於這些標准生成 .NET Framework 的目的是為了提高與非 Microsoft 解決方案的互操作性。

例如,.NET Framework SDK 所包含的 Web 服務描述語言工具可以查詢在 Web 上發布的 XML Web services,分析它的 WSDL 描述,並產生 C# 或 Visual Basic 源代碼,您的應用程序可以使用這些代碼而成為 XML Web services 的客戶端。這些源代碼可以創建從類庫中的類派生的類,這些類使用 SOAP 和 XML 分析處理所有基礎通信。雖然您可以使用類庫來直接使用 XML Web services,Web 服務描述語言工具和包含在 SDK 中的其他工具可以使您更加方便地用.NET Framework 進行開發。

如果您開發和發布自己的 XML Web services,.NET Framework 為您提供了一組符合所有基礎通信標准(如 SOAP、WSDL 和 XML)的類。使用這些類使您能夠將注意力集中在服務的邏輯上,而無需關注分布式軟件開發所需要的通信基礎結構。

最后,與托管環境中的 Web 窗體頁相似,您的 XML Web services 將使用 IIS 的可伸縮通信以本機語言的速度運行。

什么是.net?

           Visual Studio .NET 是一套完整的開發工具,用於生成 ASP Web 應用程序、XML Web services、桌面應用程序和移動應用程序。Visual Basic .NET、Visual C++ .NET、Visual C# .NET 和 Visual J# .NET 全都使用相同的集成開發環境 (IDE),該環境允許它們共享工具並有助於創建混合語言解決方案。另外,這些語言利用了 .NET Framework 的功能,此框架提供對簡化 ASP Web 應用程序和 XML Web services 開發的關鍵技術的訪問。

7Ref out有什么不同?

           方法參數上的 ref方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。ref 參數的值被傳遞到 ref 參數。傳遞到 ref 參數的參數必須最先初始化。將此方法與 out 參數相比,后者的參數在傳遞到 out 參數之前不必顯式初始化。屬性不是變量,不能作為 ref 參數傳遞。如果兩種方法的聲明僅在它們對 ref 的使用方面不同,則將出現重載。但是,無法定義僅在 ref 和 out 方面不同的重載

           方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。若要使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。不必初始化作為 out 參數傳遞的變量。然而,必須在方法返回之前為 out參數賦值。屬性不是變量,不能作為 out 參數傳遞。如果兩個方法的聲明僅在 out 的使用方面不同,則會發生重載。不過,無法定義僅在 ref 和 out 方面不同的重載。

           params 關鍵字可以指定在參數數目可變處采用參數的方法參數。在方法聲明中的 params 關鍵字之后不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字。

8.值類型與引用類型有什么不同?請舉例說明?並分別列舉幾種相應的數據類型。

     大多數編程語言提供內置的數據類型(比如整數和浮點數),這些數據類型會在作為參數傳遞時被復制(即,它們通過值來傳遞)。在 .NET Framework 中,這些稱為值類型。運行庫支持兩種值類型:

內置值類型 :.NET Framework 定義了內置值類型(如 System.Int32 和 System.Boolean),它們對應於編程語言使用的基元數據類型並與之相同。

用戶定義的值類型 :您的語言將提供各種方法來定義派生自 System.ValueType 的您自己的值類型。如果您想定義一個表示小值的類型,比如復數(使用兩個浮點數),則可以選擇將其定義為值類型,因為您可以有效地通過值來傳遞值類型。如果您要定義的類型通過引用傳遞時會更高效,則應將其定義為類。

值類型與基元類型有着同樣的存儲效率,然而您可以對它們調用方法,包括對 System.Object 和 System.ValueType 類定義的虛方法,以及對值類型本身定義的任何方法。您可以創建值類型的實例,將它們作為參數傳遞,將它們存儲為局部變量,或將它們存儲在另一值類型或對象的字段中。值類型沒有與存儲類的實例相關的系統開銷,並且它們不需要構造函數。

對於每一種值類型,運行庫都提供一種相應的已裝箱類型,這是與值類型有着相同狀態和行為的類。當需要已裝箱的類型時,某些語言要求使用特殊的語法;而另外一些語言會自動使用已裝箱的類型。在定義值類型時,需要同時定義已裝箱和未裝箱的類型。

值類型可以有字段、屬性和事件。它們也有靜態和非靜態方法。當它們被裝箱時,會從 System.ValueType 繼承虛方法,並可實現零個或更多接口。

值類型是密封的,這意味着不能從它們派生出其他類型。但是,可以直接對值類型定義虛方法,並且既可對該類型的已裝箱形式,也可對未裝箱形式調用這些方法。盡管不能從一種值類型派生出另一種類型,但是當所用語言處理虛方法比處理非虛方法或靜態方法更方便時,可以對值類型定義虛方法。

引用類型 (reference type)

由類型的實際值引用(類似於指針)表示的數據類型。如果為某個變量分配一個引用類型,則該變量將引用(或“指向”)原始值。不創建任何副本。引用類型包括類、接口、委托和裝箱值類型。引用類型值是對該類型的某個實例的一個引用,后者稱為對象。null 值比較特別,它適用於所有引用類型,用來表示“沒有被引用的實例”。

C#中引用類型的聲明:類使用 class 關鍵字聲明。接口使用interface聲明。delegate 聲明定義一種引用類型,該類型可用於將方法用特定的簽名封裝。委托實例封裝靜態方法或實例方法。委托大致類似於 C++ 中的函數指針;但是,委托是類型安全和可靠的。

C#中內置引用類型:

object 類型在 .NET Framework 中是 System.Object 的別名。可將任何類型的值賦給 object 類型的變量。所有數據類型無論是預定義的還是用戶定義的,均從 System.Object 類繼承。object 數據類型是同對象進行相互已裝箱的類型。

string 類型表示一個 Unicode 字符的字符串。string 是 .NET Framework 中 System.String 的別名。盡管 string 是引用類型,但相等運算符(== 和 !=)被定義為比較 string 對象(而不是引用)的“值”(7.9.7 字符串相等運算符)。這使得對字符串相等性的測試更為直觀。

C# 支持兩種類型:“值類型”和“引用類型”的比較:

值類型包括簡單類型(如 charint 和 float)、枚舉類型和結構類型。引用類型包括類 (Class) 類型、接口類型、委托類型和數組類型。

值類型與引用類型的區別在於值類型的變量直接包含其數據,而引用類型的變量則存儲對象引用。對於引用類型,兩個變量可能引用同一對象,因此對一個變量的操作可能影響另一個變量所引用的對象。對於值類型,每個變量都有自己的數據副本,對一個變量的操作不可能影響另一個變量。

數據類型分隔為值類型和引用類型。值類型要么是堆棧分配的,要么是在結構中以內聯方式分配的。引用類型是堆分配的。引用類型和值類型都是從最終的基類 Object 派生出來的。當值類型需要充當對象時,就在堆上分配一個包裝(該包裝能使值類型看上去像引用對象一樣),並且將該值類型的值復制給它。該包裝被加上標記,以便系統知道它包含一個值類型。這個進程稱為裝箱,其反向進程稱為取消裝箱。裝箱和取消裝箱能夠使任何類型像對象一樣進行處理。

 

9.結構體是值類型還是引用類型的?

     結構與類很相似,都表示可以包含數據成員和函數成員的數據結構。但是,與類不同,結構是一種值類型,並且不需要堆分配。結構類型的變量直接包含結構的數據,而類類型的變量包含對數據的引用(后者稱為對象)。

結構對於具有值語義的小的數據結構特別有用。復數、坐標系中的點或字典中的“鍵-值”對都是結構的典型示例。這些數據結構的關鍵之處在於:它們只有少量數據成員,它們不要求使用繼承或引用標識,而且它們適合使用值語義(賦值時直接復制值而不是復制它的引用)方便地實現。

     struct 類型是一種可包含構造函數、常數、字段、方法、屬性、索引器、運算符、事件和嵌套類型的值類型

備注

在類上調用“新建”(New) 運算符時,它將在堆上進行分配。但是,當實例化結構時,將在堆棧上創建結構。這樣將產生性能增益。而且,您不會像對待類那樣處理對結構實例的引用。您將直接對結構實例進行操作。鑒於此原因,向方法傳遞結構時,結構將通過值傳遞,而不是作為引用傳遞。

結構可以聲明構造函數,但它們必須帶參數。聲明結構的默認(無參數)構造函數是錯誤的。結構成員不能有初始值設定項。總是提供默認構造函數以將結構成員初始化為它們的默認值。使用 New 運算符創建結構對象時,將創建該結構對象,並且調用適當的構造函數。與類不同的是,結構的實例化可以不使用 New 運算符。如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態,且對象不可用。對於結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。但是,結構從基類對象繼承。結構可實現接口,而且實現方式與類實現接口的方式完全相同。通過使用屬性可以自定義結構在內存中的布局方式。結構使用簡單,並且有時證明很有用。但要牢記:結構在堆棧中創建,並且您不是處理對結構的引用,而是直接處理結構。每當需要一種將經常使用的類型,而且大多數情況下該類型只是一些數據時,結構可能是最佳選擇。

struct 類型適合表示如點、矩形和顏色這樣的輕量對象。盡管可能將一個點表示為類,但結構在某些方案中更有效。例如,如果聲明一個含有 1000 個點對象的數組,則將為引用每個對象分配附加的內存。在此情況下,結構的成本較低。

聲明結構的默認(無參數)構造函數是錯誤的。總是提供默認構造函數以將結構成員初始化為它們的默認值。

在結構中初始化實例字段是錯誤的。

使用 new 運算符創建結構對象時,將創建該結構對象,並且調用適當的構造函數。與類不同的是,結構的實例化可以不使用 new 運算符。如果不使用 new,那么在初始化所有字段之前,字段將保持未賦值狀態且對象不可用。

對於結構,不像類那樣存在繼承。一個結構不能從另一個結構或類繼承,而且不能作為一個類的基。但是,結構從基類 Object 繼承。結構可實現接口,其方式同類完全一樣。

與 C++ 不同,無法使用 struct 關鍵字聲明類。在 C# 中,類與結構在語義上是不同的。struct(結構)是值類型,而 class(類)是引用類型。除非需要引用類型語義,否則,小於 16 字節的類被系統作為結構處理可能更高效。

 

結構和類的比較:

           Visual Basic .NET 統一了結構和類的語法,結果就是兩個實體都支持大多數的相同功能。但是,在結構和類之間還有着重要的區別。

相同點

結構和類在以下方面相同:

  • 兩者都屬於“容器”類型,表示它們可以包含其他類型作為成員。
  • 兩者都具有成員,成員可以包括構造函數、方法、屬性、字段、常數、枚舉、事件和事件處理程序。
  • 兩者的成員都具有單獨的可訪問性。例如,一個成員可以聲明為 Public,而另一個可以聲明為 Private
  • 都可實現接口。
  • 都有共享的構造函數,有或沒有參數。
  • 兩者都可以公開默認屬性,只要該屬性至少帶有一個參數。
  • 兩者都可以聲明和引發事件,而且兩者都可以聲明委托。

不同點

結構和類在以下方面有所不同:

  • 結構是值類型,而類是引用類型。
  • 結構使用堆棧分配,類使用堆分配。
  • 所有的結構成員都默認為 Public;類變量和常量默認為 Private,而其他的類成員默認為 Public。類成員的這一行為提供與 Visual Basic 6.0 默認值系統的兼容。
  • 結構必須至少具有一個非共享變量或事件成員;而類可以完全是空的。
  • 結構成員不能聲明為 Protected,類成員可以。
  • 只有 Shared Sub 結構過程才能處理事件,並且只能使用 AddHandler 語句;而任何類過程都可以處理事件,並且可以使用 Handles 關鍵字或 AddHandler 語句。
  • 結構變量聲明不能指定初始值、New 關鍵字或數組初始大小,類變量聲明可以。
  • 結構從 ValueType 類隱式繼承,不能從其他類型繼承,類可以從除 ValueType 之外的其他任何類繼承。
  • 結構是不可繼承的;而類可以繼承。
  • 結構從不終止,所以公共語言運行庫 (CLR) 從不在任何結構上調用 Finalize 方法,類可由垃圾回收器終止,當檢測到沒有剩下的活動引用時,垃圾回收器將在類上調用 Finalize
  • 結構不需要構造函數;而類需要。
  • 結構僅當沒有參數時可以有非共享的構造函數;類無論有沒有參數都可以。

每一個結構都有不帶參數的隱式公共構造函數。此構造函數將結構的所有數據成員初始化為默認值。不能重定義此行為。

實例和變量

由於結構是值類型,每個結構變量都永久地綁定到一個單獨的結構實例。但類是引用類型,對象變量可引用各種類實例。此區別在下列方面影響結構和類的使用:

  • 結構變量使用結構的無參數構造函數隱式包含成員初始化。因此,Dim S As Struct1 等效於 Dim S As Struct1 = New Struct1()
  • 當將一個結構變量賦給另一個,或傳遞一個結構實例到過程參數,所有變量成員的當前值都被復制到新結構中。當將一個對象變量賦給另一個,或傳遞一個對象變量到過程,僅有引用指針被復制。
  • 可以將值 Nothing 賦給結構變量,但實例繼續保持與變量的關聯。盡管賦值重新初始化了變量成員,仍可以調用其方法並訪問其數據成員。相比之下,如果將對象變量設為 Nothing,將其與任何類實例斷開關聯,在給它賦予另一個實例前,不能通過變量訪問其他成員。
  • 對象變量可以有在不同時間賦給它的不同的類實例,幾個對象變量可以同時引用同一個類實例。當通過指向同一實例的另一個變量訪問時,更改的類成員的值會影響這些成員。但是,結構成員獨立存在於其自身實例中。更改其值不會在其他任何結構變量中反映出來,即使是在同一 Structure 聲明的其他實例中。
  • 兩個結構的等效性測試必須在成員對成員的測試中進行。兩個對象變量可使用 Equals 方法進行比較。Equals 指示兩個變量是否指向同一實例。

 

10C#中有沒有靜態構造函數,如果有是做什么用的?

           靜態構造函數用於初始化類。在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類。靜態構造函數是一種用於實現初始化類所需操作的成員。靜態構造函數是使用靜態構造函數聲明來聲明的。

           靜態構造函數聲明可包含一組屬性和一個 extern修飾符。靜態構造函數聲明的標識符必須是聲明了該靜態函數的那個類的名稱。如果指定了任何其他名稱,則發生編譯時錯誤。當靜態構造函數聲明包含 extern 修飾符時,稱該靜態構造函數為外部靜態構造函數。因為外部靜態構造函數聲明不提供任何實際的實現,所以它的靜態構造函數體由一個分號組成。對於所有其他的靜態構造函數聲明,靜態構造函數體都是一個塊,它指定當初始化該類時需要執行的語句。這正好相當於具有 void 返回類型的靜態方法的方法體。

靜態構造函數是不可繼承的,而且不能被直接調用。類的靜態構造函數在給定應用程序域中至多執行一次。應用程序域中第一次發生以下事件時將觸發靜態構造函數的執行:

  • 創建類的實例。
  • 引用類的任何靜態成員。

如果類中包含用來開始執行的 Main 方法,則該類的靜態構造函數將在調用 Main 方法之前執行。如果類包含任何帶有初始值設定項的靜態字段,則在執行該類的靜態構造函數時,先要按照文本順序執行那些初始值設定項。

11、在C#中如何實現多態?

           多態性是類為方法(這些方法以相同的名稱調用)提供不同實現方式的能力。多態性允許對類的某個方法進行調用而無需考慮該方法所提供的特定實現。例如,可能有名為 Road 的類,它調用另一個類的 Drive 方法。這另一個類 Car可能是 SportsCar 或 SmallCar,但二者都提供 Drive 方法。雖然 Drive 方法的實現因類的不同而異,但 Road 類仍可以調用它,並且它提供的結果可由 Road 類使用和解釋。

可以用不同的方式實現組件中的多態性:

  • 接口多態性 - 多個類可實現相同的“接口”,而單個類可以實現一個或多個接口。接口本質上是類需要如何響應的定義。接口描述類需要實現的方法、屬性和事件,以及每個成員需要接收和返回的參數類型,但將這些成員的特定實現留給實現類去完成。
  • 繼承多態性 - 多個類可以從單個基類“繼承”。通過繼承,類在基類所在的同一實現中接收基類的所有方法、屬性和事件。這樣,便可根據需要來實現附加成員,而且可以重寫基成員以提供不同的實現。請注意,繼承類也可以實現接口,這兩種技術不是互相排斥的。
  • 通過抽象類實現的多態性 - 抽象類同時提供繼承和接口的元素。抽象類本身不能實例化,它必須被繼承。該類的部分或全部成員可能未實現,該實現由繼承類提供。已實現的成員仍可被重寫,並且繼承類仍可以實現附加接口或其他功能。

接口和抽象類使您可以創建組件交互的定義。通過接口,可以指定組件必須實現的方法,但不實際指定如何實現方法。抽象類使您可以創建行為的定義,同時提供用於繼承類的一些公共實現。對於在組件中實現多態行為,接口和抽象類都是很有用的工具。下面將更詳細地討論這三種類型的多態性。

接口多態性:

組件編程中的一項強大技術是能夠在一個對象上實現多個接口。每個接口由一小部分緊密聯系的方法、屬性和事件組成。通過實現接口,組件可以為要求該接口的任何其他組件提供功能,而無需考慮其中所包含的特定功能。這使后續組件的版本得以包含不同的功能而不會干擾核心功能。

其他開發人員最常使用的組件功能自然是組件類本身的成員。然而,包含大量成員的組件使用起來可能比較困難。可以考慮將組件的某些功能分解出來,作為私下實現的單獨接口。

根據接口來定義功能的另一個好處是,可以通過定義和實現附加接口增量地將功能添加到組件中。優點包括:

  • 簡化了設計過程,因為組件開始時可以很小,具有最小功能;之后,組件繼續提供最小功能,同時不斷插入其他的功能,並通過實際使用那些功能來確定合適的功能。
  • 簡化了兼容性的維護,因為組件的新版本可以在添加新接口的同時繼續提供現有接口。客戶端應用程序的后續版本可以利用這些接口的優點(如果這樣做有意義)。

通過繼承實現的多態性:

Visual Basic 和 C# 也通過繼承提供多態性。對於小規模開發任務而言,這是一個功能強大的機制,但對於大規模系統,通常證明會存在問題。過分強調繼承驅動的多態性一般會導致資源大規模地從編碼轉移到設計,這對於縮短總的開發時間沒有任何幫助。如果對軟件真正的測試是看其是否適用於最終用戶,則與面向對象編程的工具相比,快速原型法和快速應用程序開發 (RAD) 的工具受到了更廣泛地歡迎。

何時使用繼承驅動的多態性

使用繼承首先是為了向現有基類添加功能。若從經過完全調試的基類框架開始,則程序員的工作效率將大大提高,方法可以增量地添加到基類而不中斷版本。當應用程序設計包含多個相關類,而對於某些通用函數,這些相關類必須共享同樣的實現時,您也可能希望使用繼承。重疊功能可以在基類中實現,應用程序中使用的類可以從該基類中派生。抽象類合並繼承和實現的功能,這在需要二者之一的元素時可能很有用。

通過抽象類實現的多態性:

抽象類提供繼承和接口實現的功能。抽象(在 Visual Basic 中是 MustInherit)類不能示例化,必須在繼承類中實現。它可以包含已實現的方法和屬性,但也可以包含未實現的過程,這些未實現過程必須在繼承類中實現。這使您得以在類的某些方法中提供不變級功能,同時為其他過程保持靈活性選項打開。抽象類的另一個好處是:當要求組件的新版本時,可根據需要將附加方法添加到基類,但接口必須保持不變。

何時使用抽象類:

當需要一組相關組件來包含一組具有相同功能的方法,但同時要求在其他方法實現中具有靈活性時,可以使用抽象類。當預料可能出現版本問題時,抽象類也具有價值,因為基類比較靈活並易於被修改。

12、什么是反射?如何實現反射?

           通過反射命名空間中的類以及 System.Type,您可以獲取有關已加載的程序集和在其中定義的類型(如類、接口和值類型)的信息。您也可以使用反射在運行時創建類型實例,然后調用和訪問這些實例。

           System.Reflection 類中最常用的方法都使用統一的模式。Module、Type 和 MemberInfo 類的成員使用下表中所示的設計模式。System.Type 類對於反射起着核心的作用。當反射請求加載的類型時,公共語言運行庫將為它創建一個 Type。您可以使用 Type 對象的方法、字段、屬性和嵌套類來查找有關該類型的所有信息。在使用 Assembly.GetType 或 Assembly.GetTypes 時傳入所需類型的名稱,可以從尚未加載的程序集中獲取 Type 對象。使用Type.GetType 可從已加載的程序集中獲取 Type 對象。使用 Module.GetType 和 Module.GetTypes 可獲取模塊 Type 對象。另一個常用的設計模式是使用委托。它們通常在反射中用來支持對返回對象數組的方法的結果集進行篩選。

           反射提供了由語言編譯器(例如 Microsoft Visual Basic .NET 和 JScript)用來實現隱式晚期綁定的基礎結構。綁定是查找與唯一指定的類型相對應的聲明(即實現)的過程。由於此過程在運行時而不是在編譯時發生,所以稱作晚期綁定。Visual Basic .NET 允許您在代碼中使用隱式的晚期綁定;Visual Basic 編譯器將調用一個幫助器方法,該方法使用反射來獲取對象類型。傳遞給幫助器方法的參數有助於在運行時調用正確的方法。這些參數包括:對其調用方法的實例(對象),被調用方法的名稱(字符串),以及傳遞給被調用方法的參數(對象數組)。

13.請解釋流與文件有什么不同?

           抽象基類 Stream 支持讀取和寫入字節。Stream 集成了異步支持。其默認實現根據其相應的異步方法來定義同步讀取和寫入,反之亦然。所有表示流的類都是從 Stream 類繼承的。Stream 類及其派生類提供數據源和儲存庫的一般視圖,使程序員不必了解操作系統和基礎設備的具體細節。

流涉及三個基本操作:

  • 可以從流讀取。讀取是從流到數據結構(如字節數組)的數據傳輸。
  • 可以向流寫入。寫入是從數據源到流的數據傳輸。
  • 流可以支持查找。查找是對流內的當前位置進行查詢和修改。

根據基礎數據源或儲存庫,流可能只支持這些功能中的一部分。例如,NetworkStreams 不支持查找。Stream 的 CanRead、CanWrite 和 CanSeek 屬性及其派生類決定不同的流所支持的操作。

           FileObject 提供文本文件的表示形式。使用 FileObject 類來執行大多數典型的文本文件操作,例如讀取、寫入、追加、復制、刪除、移動或重命名。還可以使用 FileObject 來檢查並(在某些情況下)設置文件屬性、編碼和路徑信息。FileFileInfoPathDirectory 和 DirectoryInfo 是密封類。可以創建這些類的新實例,但它們不能有派生類。

文件和流的差異:

System.IO 命名空間包含允許在數據流和文件上進行同步和異步讀取及寫入的類型。文件是一些具有永久存儲及特定順序的字節組成的一個有序的、具有名稱的集合。因此,對於文件,人們常會想到目錄路徑、磁盤存儲、文件和目錄名等方面。相反,流提供一種向后備存儲器寫入字節和從后備存儲器讀取字節的方式,后備存儲器可以為多種存儲媒介之一。正如除磁盤外存在多種后備存儲器一樣,除文件流之外也存在多種流。例如,還存在網絡流、內存流和磁帶流等。

14、程序集與命名空間有什么不同?

           程序集是 .NET Framework 應用程序的生成塊;程序集構成了部署、版本控制、重復使用、激活范圍控制和安全權限的基本單元。程序集是為協同工作而生成的類型和資源的集合,這些類型和資源構成了一個邏輯功能單元。程序集為公共語言運行庫提供它識別類型實現所需的信息。對於運行庫,類型不存在於程序集上下文之外。

程序集是 .NET Framework 編程的基本組成部分。程序集執行以下功能:

  • 包含公共語言運行庫執行的代碼。如果可移植可執行 (PE) 文件沒有相關聯的程序集清單,則將不執行該文件中的 Microsoft 中間語言 (MSIL) 代碼。請注意,每個程序集只能有一個入口點(即 DllMainWinMain 或 Main)。
  • 程序集形成安全邊界。程序集就是在其中請求和授予權限的單元。程序集形成類型邊界。每一類型的標識均包括該類型所駐留的程序集的名稱。
  • 程序集形成引用范圍邊界。程序集的清單包含用於解析類型和滿足資源請求的程序集元數據。它指定在該程序集之外公開的類型和資源。該清單還枚舉它所依賴的其他程序集。
  • 程序集形成版本邊界。程序集是公共語言運行庫中最小的可版本化單元,同一程序集中的所有類型和資源均會被版本化為一個單元。程序集的清單描述您為任何依賴項程序集所指定的版本依賴性。
  • 程序集形成部署單元。當一個應用程序啟動時,只有該應用程序最初調用的程序集必須存在。其他程序集(例如本地化資源和包含實用工具類的程序集)可以按需檢索。這就使應用程序在第一次下載時保持精簡。
  • 程序集是支持並行執行的單元。
  • 程序集可以是靜態的或動態的。靜態程序集可以包括 .NET Framework 類型(接口和類),以及該程序集的資源(位圖、JPEG 文件、資源文件等)。靜態程序集存儲在磁盤上的可移植可執行 (PE) 文件中。您還可以使用 .NET Framework來創建動態程序集,動態程序集直接從內存運行並且在執行前不存儲到磁盤上。您可以在執行動態程序集后將它們保存在磁盤上。

有幾種創建程序集的方法。您可以使用過去用來創建 .dll 或 .exe 文件的開發工具,例如 Visual Studio .NET。您可以使用在 .NET Framework SDK 中提供的工具來創建帶有在其他開發環境中創建的模塊的程序集。您還可以使用公共語言運行庫 API(例如Reflection.Emit)來創建動態程序集。

           C# 程序是利用命名空間組織起來的。命名空間既用作程序的“內部”組織系統,也用作“外部”組織系統(一種向其他程序公開自己擁有的程序元素的方法)。using 指令是用來使命名空間用起來更方便。using 指令方便了對在其他命名空間中定義的命名空間和類型的使用。using 指令僅影響命名空間或類型名稱和簡單名稱的名稱解析過程,與聲明不同,using 指令不會將新成員添加到它們與所在的編譯單元或命名空間相對應的聲明空間中。namespace 關鍵字用於聲明一個范圍。此命名空間范圍允許您組織代碼並為您提供了創建全局唯一類型的方法即使未顯式聲明命名空間,也會創建默認命名空間。該未命名的命名空間(有時稱為全局命名空間)存在於每一個文件中。全局命名空間中的任何標識符都可用於命名的命名空間中。命名空間隱式具有公共訪問權,並且這是不可修改的。

C# 程序中的若干上下文要求指定命名空間名稱或類型名稱。兩種形式的名稱都寫為以“.”標記分隔的一個或多個標識符。

namespace-name:(命名空間名稱:)

namespace-or-type-name(命名空間或類型名稱)

type-name:(類型名:)

namespace-or-type-name(命名空間或類型名稱)

namespace-or-type-name:(命名空間或類型名稱:)

identifier(標識符)
namespace-or-type-name   .   identifier(命名空間或類型名稱   .   標識符)

“類型名”是一個“命名空間或類型名稱”,它引用一個類型。需遵循下述的決策:“類型名”的“命名空間或類型名稱”必須引用一個類型,否則將發生編譯時錯誤。

“命名空間名稱”是一個“命名空間或類型名稱”,它引用一個命名空間。需遵循下述的決策:“命名空間名稱”的“命名空間或類型名稱”必須引用一個命名空間,否則將發生編譯時錯誤。

“命名空間或類型名稱”的含義按下述步驟確定:

  • 如果“命名空間或類型名稱”由單個標識符組成:
    • 如果“命名空間或類型名稱”出現在類或結構聲明體內,則從該類或結構聲明開始查找,遍及每個封閉它的類或結構聲明(若它們存在的話),如果具有給定名稱的成員存在、可訪問且表示類型,則“命名空間或類型名稱”引用該成員。請注意,當確定“命名空間或類型名稱”的含義時,會忽略非類型成員(常數、字段、方法、屬性、索引器、運算符、實例構造函數、析構函數和靜態構造函數)。
    • 否則,從發生“命名空間或類型名稱”的命名空間開始,遍及每個封閉它的命名空間(若它們存在的話),直至全局命名空間結束,對下列步驟進行評估,直到找到實體:
    • 如果命名空間包含具有給定名稱的命名空間成員,則“命名空間或類型名稱”引用該成員,並根據該成員歸為命名空間或類型類別。
    • 否則,如果命名空間有一個對應的命名空間聲明,且“命名空間或類型名稱”出現的位置包含在該命名空間聲明中,則:

如果該命名空間聲明包含一個將給定名稱與一個導入的命名空間或類型關聯的 using 別名指令,則“命名空間或類型名稱”引用該命名空間或類型。

否則,如果該命名空間聲明中有一個“using 命名空間指令”,它導入的那個命名空間內含有一個與給定名稱完全匹配的類型,則“命名空間或類型名稱”引用該類型。

否則,如果該“using 命名空間指令”導入的命名空間包含多個具有給定名稱的類型,則“命名空間或類型名稱”就被認為是含義不清的,將導致發生錯誤。

    • 否則,“命名空間或類型名稱”就被認為是未定義的,導致發生編譯時錯誤。
  • 否則,“命名空間或類型名稱”的形式為 N.I,其中 N 是由除最右邊的標識符以外的所有標識符組成的“命名空間或類型名稱”,I 是最右邊的標識符。N 最先按“命名空間或類型名稱”解析。如果對 N 的解析不成功,則發生編譯時錯誤。否則,N.I 按下面這樣解析:
    • 如果 N 是一個命名空間而 I 是該命名空間中可訪問成員的名稱,則 N.I 引用該成員,並根據該成員歸為命名空間或類型類別。
    • 如果 N 是類或結構類型而 I 是 N 中可訪問類型的名稱,則 N.I 引用該類型。
    • 否則,N.I 是無效的命名空間或類型名稱並將發生編譯時錯誤。

15、請編寫一個捕獲所有錯誤的錯誤處理代碼?

           Try{ (程序代碼) }catch(System.Exception e){ (錯誤處理代碼) }

一個try塊只能有一個常規catch塊。不允許一個try塊有多個常規catch塊,否則將導致編譯時錯誤。(常規catch塊:特殊的catch塊,可以撲獲任何類型的異常)。

           異常是程序執行時遇到的任何錯誤情況或意外行為。以下這些情況都可以引發異常:您的代碼或調用的代碼(如共享庫)中有錯誤,操作系統資源不可用,公共語言運行庫遇到意外情況(如無法驗證代碼),等等。對於這些情況,應用程序可以從其中一些恢復,而對於另一些,則不能恢復。盡管可以從大多數應用程序異常中恢復,但不能從大多數運行庫異常中恢復。

在 .NET Framework 中,異常是從 Exception 類類繼承的對象。異常從發生問題的代碼區域引發,然后沿堆棧向上傳遞,直到應用程序處理它或程序終止。

運行庫如何管理異常

運行庫使用基於異常對象和受保護代碼塊的異常處理模型。發生異常時,創建一個 Exception 對象來表示該異常。

運行庫為每個可執行文件創建一個異常信息表。在異常信息表中,可執行文件的每個方法都有一個關聯的異常處理信息數組(可以為空)。數組中的每一項描述一個受保護的代碼塊、任何與該代碼關聯的異常篩選器和任何異常處理程序(Catch 語句)。此異常表非常有效,在沒有發生異常時,在處理器時間或內存使用上沒有性能損失。僅在異常發生時使用資源。

異常信息表對於受保護的塊有四種類型的異常處理程序:

  • Finally 處理程序,它在每次塊退出時都執行,不論退出是由正常控制流引起的還是由未處理的異常引起的。
  • 錯誤處理程序,它在異常發生時必須執行,但在正常控制流完成時不執行。
  • 類型篩選的處理程序,它處理指定類或該類的任何派生類的任何異常。
  • 用戶篩選的處理程序,它運行用戶指定的代碼,來確定異常應由關聯的處理程序處理還是應傳遞給下一個受保護的塊。

每種語言根據自己的規范實現這些異常處理程序。例如,Visual Basic .NET 通過 Catch 語句中的變量比較(使用 When 關鍵字)提供對用戶篩選的處理程序的訪問;C# 不實現用戶篩選的處理程序。

異常發生時,運行庫開始執行由下列兩步組成的過程:

1.      運行庫在數組中搜索滿足下列條件的第一個受保護塊:

·         保護包含當前執行的指令的區域,而且

·         包含異常處理程序或包含處理異常的篩選器。

2.      如果出現匹配項,運行庫創建一個 Exception 對象來描述該異常。然后運行庫執行位於發生異常的語句與處理該異常的語句之間的所有 Finally 語句或錯誤處理語句。請注意,異常處理程序的順序很重要:最里面的異常處理程序最先計算。還請注意,異常處理程序可以訪問捕捉異常的例程的局部變量和本地內存,但引發異常時的任何中間值都會丟失。

如果當前方法中沒有出現匹配項,則運行庫搜索當前方法的每一個調用方,並沿着堆棧一直向上查找。如果任何調用方都沒有匹配項,則運行庫允許調試器訪問該異常。如果調試器不能附加到該異常,則運行庫引發UnhandledException 事件。如果沒有 UnhandledException 事件的偵聽器,則運行庫轉儲堆棧跟蹤並結束程序。

篩選運行庫異常

可以按類型或按某些用戶定義的條件對捕捉和處理的異常進行篩選。類型篩選的處理程序處理特定類型的異常(或從該異常派生的類)。最常見形式的類型篩選的異常處理程序指定僅捕捉特定類型的異常。

有兩種類型的異常:由執行程序生成的異常和由公共語言運行庫生成的異常。錯誤發生時,運行庫引發 SystemException 的適當派生類。這些錯誤是失敗的運行庫檢查(如數組超出界限錯誤)導致的,它們可在任何方法的執行過程中發生。ApplicationException 由用戶程序引發,而不是由運行庫引發。如果設計創建新異常的應用程序,應從 ApplicationException 類派生那些異常。不建議捕捉 SystemException,在應用程序中引發 SystemException 也不是好的編程做法。

程序必須能夠統一處理在執行期間發生的錯誤。公共語言運行庫提供了一個平台,以統一的方式通知程序發生的錯誤,這樣為設計容錯軟件提供了極大的幫助。所有的 .NET Framework 操作都通過引發異常來指示出現錯誤。

傳統上,語言的錯誤處理模型依賴於語言檢測錯誤和查找錯誤處理程序的獨特方法,或者依賴於操作系統提供的錯誤處理機制。運行庫實現的異常處理具有下列特點:

  • 處理異常時不考慮生成異常的語言或處理異常的語言。
  • 異常處理時不要求任何特定的語言語法,而是允許每種語言定義自己的語法。
  • 允許跨進程甚至跨計算機邊界引發異常。

與其他錯誤通知方法(如返回代碼)相比,異常具有若干優點。不再有出現錯誤而不被人注意的情況。無效值不會繼續在系統中傳播。不必檢查返回代碼。可以輕松添加異常處理代碼,以增加程序的可靠性。最后,運行庫的異常處理比基於Windows 的 C++ 錯誤處理更快。

由於執行線程例行地遍歷托管代碼塊和非托管代碼塊,因此運行庫可以在托管代碼或非托管代碼中引發或捕捉異常。非托管代碼可以同時包含 C++ 樣式的 SEH 異常和基於 COM 的 HRESULT。

16.委托與事件是什么關系?為什么要使用委托?

         運行庫支持稱為委托的引用類型,其作用類似於 C++ 中函數指針的用途。與函數指針不同,委托實例獨立於它所封裝的方法的類;最主要的是那些方法與委托的類型是兼容的。另外,函數指針只能引用靜態函數,而委托可以引用靜態和實例方法。委托主要用於 .NET Framework 中的事件處理程序和回調函數。

委托適用於那種在某些其他語言中需用函數指針來解決的情況(場合)。但是,與函數指針不同,委托是面向對象和類型安全的。delegate 聲明定義一種引用類型,該類型可用於將方法用特定的簽名封裝。委托實例封裝靜態方法或實例方法。委托大致類似於 C++ 中的函數指針。委托聲明定義一個類,它是從 System.Delegate 類派生的類。委托實例封裝了一個調用列表,該列表列出了一個或多個方法,每個方法稱為一個可調用實體。對於實例方法,可調用實體由一個實例和該實例的方法組成。對於靜態方法,可調用實體僅由一個方法組成。如果用一組合適的參數來調用一個委托實例,則該委托實例所封裝的每個可調用實體都會被調用,並且用的都是上述的同一組參數,就是用此給定的參數集來調用該委托實例的每個可調用實體。

委托是用來處理其他語言(如 C++、Pascal 和 Modula)需用函數指針來處理的情況的。不過與 C++ 函數指針不同,委托是完全面對對象的;另外,C++ 指針僅指向成員函數,而委托同時封裝了對象實例和方法。

委托聲明定義一個從 System.Delegate 類派生的類。委托實例封裝一個調用列表,該列表列出一個或多個方法,其中每個方法均作為一個可調用實體來引用。對於實例方法,可調用實體由該方法和一個相關聯的實例組成。對於靜態方法,可調用實體僅由一個方法組成。用一個適當的參數集來調用一個委托實例委托實例的一個有趣且有用的屬性是:它既不知道也不關心有關它所封裝的方法所屬的類的種種詳情;對它來說最重要的是這些方法與該委托的類型兼容。這使委托非常適合“匿名”調用。這是一個強大的功能。委托是一個可以對方法進行引用的類。與其他的類不同,委托類具有一個簽名,並且它只能對與其簽名匹配的方法進行引用。這樣,委托就等效於一個類型安全函數指針或一個回調。委托使您得以將函數作為參數傳遞。委托的類型安全要求作為委托傳遞的函數擁有同委托聲明相同的簽名。

定義和使用委托分三個步驟:聲明、實例化和調用。

所有委托都是從 System.Delegate 繼承而來的,並且有一個調用列表,這是在調用委托時所執行的方法的一個鏈接列表。產生的委托可以用匹配的簽名引用任何方法。沒有為具有返回類型並在調用列表中包含多個方法的委托定義返回值。

可以使用委托的 Combine 和 Remove 方法在其調用列表中添加和移除方法。若要調用委托,可使用 Invoke 方法,或者使用 BeginInvoke 和 EndInvoke 方法異步調用委托。委托類的實現是由運行庫提供的,而不是由用戶代碼提供的。

委托是事件的基礎,.NET Framework 中的事件是基於委托模型的。

event指定一個事件:

event 關鍵字使您得以指定當代碼中的某些“事件”發生時調用的委托。此委托可以有一個或多個關聯的方法,當代碼指示該事件已發生時將調用關聯的方法。可使一個程序中的事件用於面向 .NET Framework 公共語言運行庫的其他程序。

為了創建並使用 C# 事件,必須采取以下步驟:

1.      創建或標識一個委托。如果正在定義自己的事件,還必須確保有與事件關鍵字一起使用的委托。如果已經預定義了事件(例如在 .NET Framework 中),則事件的使用者只需要知道委托的名稱。

2.      創建一個類,包含:

a.      從委托創建的事件。

b.      (可選)驗證用 event 關鍵字聲明的委托實例是否存在的方法。否則,該邏輯必須放置在引發此事件的代碼中。

c.      調用此事件的方法。這些方法可以重寫一些基類功能。

3.      定義一個或多個將方法連接到事件的類。所有這些類都包括:

·         使用 += 運算符和 -= 運算符將一個或多個方法與基類中的事件關聯。

·         將與事件關聯的方法的定義。

4.      使用此事件:

·         創建包含事件聲明的類對象。

·         使用定義的構造函數,創建包含事件定義的類對象。

事件是對象發送的消息,以發信號通知操作的發生。操作可能是由用戶交互(例如鼠標單擊)引起的,也可能是由某些其他的程序邏輯觸發的。引發(觸發)事件的對象叫做事件發送方。捕獲事件並對其作出響應的對象叫做事件接收方。

在事件通信中,事件發送方類不知道哪個對象或方法將接收到(處理)它引發的事件。所需要的是在源和接收方之間存在一個媒介(或類似指針的機制)。.NET Framework 定義了一個特殊的類型(Delegate),該類型提供函數指針的功能。

事件委托是多路廣播的,這意味着它們可以對多個事件處理方法進行引用。有關詳細信息,請參見 Delegate。委托考慮了事件處理中的靈活性和精確控制。通過維護事件的已注冊事件處理程序列表,委托為引發事件的類擔當事件發送器的角色。

事件功能是由三個互相聯系的元素提供的:提供事件數據的類、事件委托和引發事件的類。.NET Framework 具有命名與事件相關的類和方法的約定。如果想要您的類引發一個名為 EventName 的事件,您需要以下元素。

  • 持有事件數據的類,名為 EventNameEventArgs。該類必須從 System.EventArgs 導出。
  • 事件的委托,名為 EventNameEventHandler。
  • 引發事件的類。該類必須提供:

a.      事件聲明。

b.      引發事件的方法。 

.NET Framework 類庫或第三方類庫中可能已經定義了事件數據類和事件委托類。

17、一個類中有幾種元素?

一個類可包含下列成員的聲明:

構造函數、析構函數、常數、字段、方法、屬性 、索引器、運算符、事件、委托、類、接口、結構

類可以定義對象可執行的操作(方法、事件或屬性),並定義保存對象(字段)狀態的值。盡管類通常同時包含定義和實現,但它也可以包含沒有實現的一個或多個成員。類的實例是對象。可以通過調用對象的方法並訪問其屬性、事件和字段,來訪問對象的功能。

 

 

特征

說明

sealed

指定不能從這種類型派生出另一種類型。

implements

指出該類通過提供接口成員的實現,使用一個或多個接口。

abstract

指定不能創建類的實例。若要使用它,必須由其派生出另一個類。

inherits

指出可以在指定了基類的任何地方使用類的實例。從基類繼承的派生類可以使用基類提供的任何虛方法的實現,或者派生類可以用自己的實現重寫它們。

exported 或 not exported

指出某個類在定義它的程序集之外是否可見。僅適用於頂級類。

嵌套類也有成員特征。沒有實現的類成員是抽象成員。有一個或更多抽象成員的類其本身也是抽象的;不可以創建它的新實例。以運行庫為目標的某些語言允許將類標記為抽象,即使其成員都不是抽象的也是如此。當需要封裝一組派生類可在適當時候繼承或重寫的基本功能時,可以使用抽象類。非抽象的類稱為具體類。類可以實現任何數量的接口,但它只能從一個基類繼承。所有的類都必須至少有一個構造函數,該函數初始化此類的新實例。

18、請解釋這種語法現象Session[name]=20;

索引器

索引器允許類或結構的實例按照與數組相同的方式進行索引。索引器類似於屬性,不同的是它們的訪問器采用參數。

索引器使您得以按照與數組相同的方式為類或結構實例建立索引。索引器的 get 訪問器體與方法體類似。它返回索引器的類型。get 訪問器使用與索引器相同的 formal-index-parameter-list。索引器的 set 訪問器體與方法體類似。除了value 隱式參數外,它還使用與索引器相同的 formal-index-parameter-list。索引器的類型和 formal-index-parameter-list 中引用的每個類型必須至少與索引器本身一樣是可訪問的。索引器的簽名由其形參的數量和類型組成。它不包括索引器類型或形參名。如果在同一類中聲明一個以上的索引器,則它們必須具有不同的簽名。索引器值不作為變量來分類;因此,不可能將索引器值作為 ref 或 out 參數來傳遞。若要為索引器提供可由其他語言用於默認索引屬性的名稱,可在聲明中使用 name 屬性。

索引器允許類或結構的實例按照與數組相同的方式進行索引。索引器類似於屬性,不同的是它們的訪問器采用參數。屬性的訪問器包含與獲取(讀取或計算)或設置(寫)屬性有關的可執行語句。訪問器聲明可以包含 get 訪問器或 set 訪問器,或者兩者均包含。get 訪問器體與方法體相似。它必須返回屬性類型的值。執行 get 訪問器相當於讀取字段的值。set 訪問器與返回 void 的方法類似。它使用稱為 value 的隱式參數,此參數的類型是屬性的類型。

屬性是類、結構和接口的命名成員。它們提供了通過訪問器讀、寫或計算私有字段值的靈活機制。屬性按如下方式,根據所使用的訪問器進行分類:

  • 只帶有 get 訪問器的屬性稱為只讀屬性。無法對只讀屬性賦值。
  • 只帶有 set 訪問器的屬性稱為只寫屬性。只寫屬性除作為賦值的目標外,無法對其進行引用。
  • 同時帶有 get 和 set 訪問器的屬性為讀寫屬性。

在屬性聲明中,get 和 set 訪問器都必須在屬性體的內部聲明。

索引器與屬性類似。除下表中顯示的差別外,為屬性訪問器定義的所有規則同樣適用於索引器訪問器。

屬性

索引器

通過名稱標識。

通過簽名標識。

通過簡單名稱或成員訪問來訪問。

通過元素訪問來訪問。

可以為靜態成員或實例成員。

必須為實例成員。

屬性的 get 訪問器沒有參數。

索引器的 get 訪問器具有與索引器相同的形參表。

屬性的 set 訪問器包含隱式 value 參數。

除了 value 參數外,索引器的 set 訪問器還具有與索引器相同的形參表。

 

19、裝箱與取消裝箱是什么含義?

           裝箱 (boxing)

值類型實例到對象的轉換,它暗示在運行時實例將攜帶完整的類型信息,並在堆中分配。Microsoft 中間語言 (MSIL) 指令集的 box 指令,通過復制值類型,並將它嵌入到新分配的對象中,將值類型轉換為對象。

           取消裝箱 (unboxing)

將對象實例轉換為值類型。

 

20、一個構造函數能否調用另一個構造函數,如果能請寫出簡單的代碼

創建新對象時將調用類構造函數,一個類可以有多個構造函數。可以聲明一個不帶參數的構造函數,和一個帶參數的構造函數。如果類沒有構造函數,將自動生成一個默認的無參數構造函數,並使用默認值初始化對象字段(例如,int 將初始化為 0)。類構造函數可通過初始值設定項來調用基類的構造函數,通過基類構造函數初始化字段。

           public Cylinder(double readius,double height):base(radius,height){

           }

類構造函數也可通過關鍵字 this 調用同一個類的另一個構造函數。

           Public Point():this(0,20){

           }

無參數構造函數 Point() 調用了另一個帶有兩個參數的構造函數,將默認位置初始化為 (0, 20)。

三種類構造函數:

類構造函數的類型

注釋

實例

用於創建並初始化類的實例。

私有

在類之外不可訪問的特殊類型實例構造函數。無法用私有構造函數來實例化類。

靜態

在創建第一個實例或引用任何靜態成員之前,將自動調用這種構造函數來初始化類。無法直接調用這種構造函數。

私有構造函數是一種特殊的實例構造函數。它通常用在只包含靜態成員的類中。如果類具有一個或多個私有構造函數而沒有公共構造函數,則不允許其他類(除了嵌套類)創建該類的實例。聲明空構造函數可阻止自動生成默認構造函數。注意,如果您不對構造函數使用訪問修飾符,則在默認情況下它仍為私有構造函數。但是,通常顯式地使用 private(私有)修飾符來清楚地表明該類不能被實例化。

靜態構造函數用於初始化類。在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類。靜態構造函數既沒有訪問修飾符,也沒有參數。在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類。無法直接調用靜態構造函數。在程序中,用戶無法控制何時執行靜態構造函數。靜態構造函數的典型用途是:當類使用日志文件時,將使用這種構造函數向日志文件中寫入項。當沒有實例字段或實例方法(如 Math 類)或調用方法以獲得類的實例時,私有構造函數可用於阻止創建類。

結構構造函數類似於類構造函數,只是存在以下差異:

  • 結構不能包含顯式的無參數構造函數。結構成員將自動初始化為它們的默認值。
  • 結構不能有以下形式的初始值設定項:base (argument-list)。

析構函數:

析構函數用於銷毀類的實例不能對結構使用析構函數。只能對類使用析構函數。一個類只能有一個析構函數。無法繼承或重載析構函數。無法調用析構函數。它們是被自動調用的。析構函數既沒有修飾符,也沒有參數。

21、請編寫創建一個線程的代碼。

           .NET Framework 通過提供面向對象的線程模型來使您能夠快速、方便地創建多線程應用程序。新建一個線程相當簡單,只需將其聲明並為其提供線程起始點處的方法委托。當您准備好在線程上開始執行時,請調用 Thread.Start 方法。當使用多個執行線程時,涉及到多個特殊注意事項。

創建新的執行線程

1.     聲明該線程。

System.Threading.Thread myThread;

2.     用線程起始點的適當委托實例化該線程。使用 AddressOf 運算符在 Visual Basic 中創建委托,或在 C# 中創建新的 ThreadStart 對象。 

MyThread=new System.Threading.Thread(new System.Threading.ThreadStart(myStartingMethod));

生活的如此優美,不是詩化的結果,而是夢想的味道!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM