C#習題大全javascript
1.String str=new String("a")和String str = "a"有什麼區別?html
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 java
2.判斷字符串變量str是否爲空的一下三種方法哪一個性能更優c++
a、str=="";b、str==String.Empty;c、str.Length==0;?答案是c;程序員
3.string與String的區別web
string、int是C#定義的類型,而String、Int32是.net類型便是CTS類型; string 是 .NET 框架中 System.String 的別名。string在編譯的時候會轉化爲String類面試
4.虛方法(virtual )和抽象方法(abstract)的區別?正則表達式
1:抽象方法僅有聲明,而沒有任何實現,如abstract someMethod();,虛方法卻不能如此算法
virtual用於修飾方法、屬性、索引器或事件聲明,並使它們能夠在派生類中被重寫。
2:子類繼承父類,能夠對父類中的虛方法進行重寫、覆蓋、不處理三種處理(見5),對抽象方法卻必須實現sql
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.解釋一下UDDI、WSDL的意義及其做用。
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 頁中。
用戶控件中沒有 html、body 或 form 元素。這些元素必須位於宿主頁中。
能夠在用戶控件上使用與在 ASP.NET 網頁上所用相同的 HTML 元素(html、body 或 form 元除外)和 Web 控件。例如,若是您要建立一個將用做工具欄的用戶控件,則能夠將一系列 Button Web服務器控件放在該控件上,並建立這些按鈕的事件處理程序。
建立用戶控件要比建立自定義控件方便不少,由於能夠重用現有的控件。用戶控件使建立具備複雜用戶界面元素的控件極爲方便。
30.什麼叫應用程序域?什麼是受管制的代碼?什麼是強類型系統?什麼是裝箱和拆箱?什麼是重載?
CTS、CLS和CLR分別做何解釋?
應用程序域應用程序域爲安全性、可靠性、版本控制以及卸載程序集提供了隔離邊界。應用程序域一般由運行庫宿主建立,運行庫宿主負責在運行應用程序以前引導公共語言運行庫。應用程序域提供了一個更安全、用途更廣的處理單元,公共語言運行庫可以使用該單元提供應用程序之間的隔離。託管代碼使用基於公共語言運行庫的語言編譯器開發的代碼稱爲託管代碼;託管代碼具備許多優勢,例如:跨語言集成、跨語言異常處理、加強的安全性、版本控制和部署支持、簡化的組件交互模型、調試和分析服務等。裝箱和拆箱裝箱和拆箱使值類型可以被視爲對象。對值類型裝箱將把該值類型打包到 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.NET中button 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.DataReader與Dataset有什麼區別?
DataReader和DataSet最大的區別在於,DataReader使用時始終佔用SqlConnection,在線操做數據庫.任何對SqlConnection的操做都會引起DataReader的異常.由於DataReader每次只在內存中加載一條數據,因此佔用的內存是很小的..由於DataReader的特殊性和高性能.因此DataReader是隻進的.你讀了第一條後就不能再去讀取第一條了. DataSet則是將數據一次性加載在內存中.拋棄數據庫鏈接.讀取完畢即放棄數據庫鏈接.由於DataSet將數據所有加載在內存中.因此比較消耗內存.可是確比DataReader要靈活.能夠動態的添加行,列,數據.對數據庫進行回傳更新操做
66.若是在一個B/S結構的系統中須要傳遞變量值,可是又不能使用Session、Cookie、Application,您有
幾種方法進行處理?
使用Request["string"].Request.QueryString["flag"]
67.用.net作B/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 必須知足下列要求:
集合類型:
必須是 interface、class 或 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 class和interface有什麼區別
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#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?
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.DataReader與Dataset有什麼區別?
執行查詢時會傳回結果,並一直儲存於客戶端上的網絡緩衝區中,直至您使用 DataReader 的 Read 方法要求它們爲止。使用 DataReader 能夠提升應用程序的效能,方法是當即擷取可用的數據,及 (依預設) 一 次只將一個數據列儲存到內存中,從而減小系統負荷
DataSet 是以常駐內存表示的數據,不論內含數據來源爲什麼,均可提供一致的關係型程序設計模型。DataSet 表示一組完整的數據,包括內含、排序和約束數據的數據表,以及數據表間的關聯性。
131.簡要說出private、protected的區別
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.請描述一下在.net中Forms認證模式下,怎樣用代碼(用戶名單存在數據庫中,而不是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 Shop,IBuySpy Store,DotNetNuke,NUnit,Data 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,WebPart和C#的匿名函數和泛型,但願能夠簡要地闡述其中
的特色
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.描述怎樣區分使用ExecuteNonQuery和ExecuteScalar方法?
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-templates,xsl:call-template,xsl:choose,xsl: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={B→A,BC→D},那麼關係框架R最高是....................(a)
a. 第一範式的
b. 第二範式的
c. 第三範式的
d. BCNF範式的
172.設有關係EMP(ENO,ENAME,SALARY,DNO ),其中各屬性的含義依次爲職工號、姓名、工資和所在部門號,以及關係DEPT(DNO,DNAME,MANAGER),其中各屬性含義依次爲部門號、部門名稱、部門經理的職工號。試用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--> Break; case 2: <!--把cost賦值爲100--> Break; case 3: <!--把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. 如下關於ref和out的描述哪些項是正確的?(多選) ( 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控件顯示員工的列表。您打算修改這個控件以便在這個Grid的Footer顯示員工合計數。請問您應該怎麼作?( 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
成員函數,同時還可能使用顯式接口成員實現來實現接口的方法
在方法調用、屬性訪問或索引器訪問中,不能直接訪問「顯式接口成員實現」的成員,即便用它的徹底限定名也不行。「顯式接口成員實現」的成員只能經過接口實例訪問,而且在經過接口實例訪問時,只能用該接口成員的簡單名稱來引用。
顯式接口成員實現中包含訪問修飾符屬於編譯時錯誤,並且若是包含 abstract
、virtual
、override
或 static
修飾符也屬於編譯時錯誤。
顯式接口成員實現具備與其餘成員不一樣的可訪問性特徵。因爲顯式接口成員實現永遠不能在方法調用或屬性訪問中經過它們的徹底限定名來訪問,所以,它們彷佛是 private(私有的)。可是,由於它們能夠經過接口實例來訪問,因此它們彷佛又是 public(公共的)。
顯式接口成員實現有兩個主要用途:
因爲顯式接口成員實現不能經過類或結構實例來訪問,所以它們就不屬於類或結構的自身的公共接口。當需在一個公用的類或結構中實現一些僅供內部使用(不容許外界訪問)的接口時,這就特別有用。
顯式接口成員實現能夠消除因同時含有多個相同簽名的接口成員所引發的多義性。若是沒有顯式接口成員實現,一個類或結構就不可能爲具備相同簽名和返回類型的接口成員分別提供相應的實現,也不可能爲具備相同簽名和不一樣返回類型的全部接口成員中的任何一個提供實現。
爲了使顯式接口成員實現有效,聲明它的類或結構必須在它的基類列表中指定一個接口,而該接口必須包含一個成員,該成員的徹底限定名、類型和參數類型與該顯式接口成員實現所具備的徹底相同。
請以圖示方式解釋性 .net framework?
.NET Framework 是一種新的計算平臺,它簡化了在高度分佈式 Internet 環境中的應用程序開發。.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 開發下列類型的應用程序和服務:
例如,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 開發的關鍵技術的訪問。
7、Ref 與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# 支持兩種類型:「值類型」和「引用類型」的比較:
值類型包括簡單類型(如 char
、int
和 float
)、枚舉類型和結構類型。引用類型包括類 (Class) 類型、接口類型、委託類型和數組類型。
值類型與引用類型的區別在於值類型的變量直接包含其數據,而引用類型的變量則存儲對象引用。對於引用類型,兩個變量可能引用同一對象,所以對一個變量的操做可能影響另外一個變量所引用的對象。對於值類型,每一個變量都有本身的數據副本,對一個變量的操做不可能影響另外一個變量。
數據類型分隔爲值類型和引用類型。值類型要麼是堆棧分配的,要麼是在結構中之內聯方式分配的。引用類型是堆分配的。引用類型和值類型都是從最終的基類 Object 派生出來的。當值類型須要充當對象時,就在堆上分配一個包裝(該包裝能使值類型看上去像引用對象同樣),而且將該值類型的值複製給它。該包裝被加上標記,以便系統知道它包含一個值類型。這個進程稱爲裝箱,其反向進程稱爲取消裝箱。裝箱和取消裝箱可以使任何類型像對象同樣進行處理。
9.結構體是值類型仍是引用類型的?
結構與類很類似,都表示能夠包含數據成員和函數成員的數據結構。可是,與類不一樣,結構是一種值類型,而且不須要堆分配。結構類型的變量直接包含結構的數據,而類類型的變量包含對數據的引用(後者稱爲對象)。
結構對於具備值語義的小的數據結構特別有用。複數、座標系中的點或字典中的「鍵-值」對都是結構的典型示例。這些數據結構的關鍵之處在於:它們只有少許數據成員,它們不要求使用繼承或引用標識,並且它們適合使用值語義(賦值時直接複製值而不是複製它的引用)方便地實現。
struct 類型是一種可包含構造函數、常數、字段、方法、屬性、索引器、運算符、事件和嵌套類型的值類型
在類上調用「新建」(New) 運算符時,它將在堆上進行分配。可是,當實例化結構時,將在堆棧上建立結構。這樣將產生性能增益。並且,您不會像對待類那樣處理對結構實例的引用。您將直接對結構實例進行操做。鑑於此緣由,向方法傳遞結構時,結構將經過值傳遞,而不是做爲引用傳遞。
結構能夠聲明構造函數,但它們必須帶參數。聲明結構的默認(無參數)構造函數是錯誤的。結構成員不能有初始值設定項。老是提供默認構造函數以將結構成員初始化爲它們的默認值。使用 New 運算符建立結構對象時,將建立該結構對象,而且調用適當的構造函數。與類不一樣的是,結構的實例化能夠不使用 New 運算符。若是不使用「新建」(new),那麼在初始化全部字段以前,字段將保持未賦值狀態,且對象不可用。對於結構,不像類那樣存在繼承。一個結構不能從另外一個結構或類繼承,並且不能做爲一個類的基。可是,結構從基類對象繼承。結構可實現接口,並且實現方式與類實現接口的方式徹底相同。經過使用屬性能夠自定義結構在內存中的佈局方式。結構使用簡單,而且有時證實頗有用。但要牢記:結構在堆棧中建立,而且您不是處理對結構的引用,而是直接處理結構。每當須要一種將常用的類型,並且大多數狀況下該類型只是一些數據時,結構多是最佳選擇。
struct 類型適合表示如點、矩形和顏色這樣的輕量對象。儘管可能將一個點表示爲類,但結構在某些方案中更有效。例如,若是聲明一個含有 1000 個點對象的數組,則將爲引用每一個對象分配附加的內存。在此狀況下,結構的成本較低。
聲明結構的默認(無參數)構造函數是錯誤的。老是提供默認構造函數以將結構成員初始化爲它們的默認值。
在結構中初始化實例字段是錯誤的。
使用 new 運算符建立結構對象時,將建立該結構對象,而且調用適當的構造函數。與類不一樣的是,結構的實例化能夠不使用 new 運算符。若是不使用 new,那麼在初始化全部字段以前,字段將保持未賦值狀態且對象不可用。
對於結構,不像類那樣存在繼承。一個結構不能從另外一個結構或類繼承,並且不能做爲一個類的基。可是,結構從基類 Object 繼承。結構可實現接口,其方式同類徹底同樣。
與 C++ 不一樣,沒法使用 struct 關鍵字聲明類。在 C# 中,類與結構在語義上是不一樣的。struct(結構)是值類型,而 class(類)是引用類型。除非須要引用類型語義,不然,小於 16 字節的類被系統做爲結構處理可能更高效。
結構和類的比較:
Visual Basic .NET 統一告終構和類的語法,結果就是兩個實體都支持大多數的相同功能。可是,在結構和類之間還有着重要的區別。
結構和類在如下方面相同:
結構和類在如下方面有所不一樣:
每個結構都有不帶參數的隱式公共構造函數。此構造函數將結構的全部數據成員初始化爲默認值。不能重定義此行爲。
因爲結構是值類型,每一個結構變量都永久地綁定到一個單獨的結構實例。但類是引用類型,對象變量可引用各類類實例。此區別在下列方面影響結構和類的使用:
Dim S As Struct1
等效於 Dim S As Struct1 = New Struct1()
。
10、C#中有沒有靜態構造函數,若是有是作什麼用的?
靜態構造函數用於初始化類。在建立第一個實例或引用任何靜態成員以前,將自動調用靜態構造函數來初始化類。靜態構造函數是一種用於實現初始化類所需操做的成員。靜態構造函數是使用靜態構造函數聲明來聲明的。
靜態構造函數聲明可包含一組屬性和一個 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 來檢查並(在某些狀況下)設置文件屬性、編碼和路徑信息。File、FileInfo、Path、Directory 和 DirectoryInfo 是密封類。能夠建立這些類的新實例,但它們不能有派生類。
文件和流的差別:
System.IO 命名空間包含容許在數據流和文件上進行同步和異步讀取及寫入的類型。文件是一些具備永久存儲及特定順序的字節組成的一個有序的、具備名稱的集合。所以,對於文件,人們常會想到目錄路徑、磁盤存儲、文件和目錄名等方面。相反,流提供一種向後備存儲器寫入字節和從後備存儲器讀取字節的方式,後備存儲器能夠爲多種存儲媒介之一。正如除磁盤外存在多種後備存儲器同樣,除文件流以外也存在多種流。例如,還存在網絡流、內存流和磁帶流等。
14、程序集與命名空間有什麼不一樣?
程序集是 .NET Framework 應用程序的生成塊;程序集構成了部署、版本控制、重複使用、激活範圍控制和安全權限的基本單元。程序集是爲協同工做而生成的類型和資源的集合,這些類型和資源構成了一個邏輯功能單元。程序集爲公共語言運行庫提供它識別類型實現所需的信息。對於運行庫,類型不存在於程序集上下文以外。
程序集是 .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 語句)。此異常表很是有效,在沒有發生異常時,在處理器時間或內存使用上沒有性能損失。僅在異常發生時使用資源。
異常信息表對於受保護的塊有四種類型的異常處理程序:
每種語言根據本身的規範實現這些異常處理程序。例如,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 的事件,您須要如下元素。
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 訪問器沒有參數。 |
索引器的 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 類)或調用方法以得到類的實例時,私有構造函數可用於阻止建立類。
結構構造函數相似於類構造函數,只是存在如下差別:
析構函數:
析構函數用於銷燬類的實例不能對結構使用析構函數。只能對類使用析構函數。一個類只能有一個析構函數。沒法繼承或重載析構函數。沒法調用析構函數。它們是被自動調用的。析構函數既沒有修飾符,也沒有參數。
.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));