国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
C#概述


概述

1. 什么是C#?   

Microsoft是這樣描述C#的:“C#是從C和C++派生來(lái)的一種簡(jiǎn)單、現(xiàn)代、面向?qū)ο蠛皖愋桶踩木幊陶Z(yǔ)言。C#(讀做‘Csharp’)主要是從C/C++編程語(yǔ)言家族移植過(guò)來(lái)的,C和C++的程序員會(huì)馬上熟悉它。C#試圖結(jié)合VisualBasic的快速開(kāi)發(fā)能力和C++的強(qiáng)大靈活的能力。” 



2. 如何開(kāi)發(fā)C#C#非常像Java語(yǔ)言——這兩種語(yǔ)言的核心和C++相比都有相似的優(yōu)缺點(diǎn)。例如,兩個(gè)語(yǔ)言都有垃圾回收,但是兩個(gè)語(yǔ)言都沒(méi)有模板(template)。Microsoft已經(jīng)中止了Visual J++產(chǎn)品,因此很難不認(rèn)為Microsoft在使用C#來(lái)替代Java。 

   

4. C#可以取代 C++?
   

顯然是不,但是我們又很難說(shuō)C++是新的.NET平臺(tái)上編寫(xiě)代碼的最佳選擇。為了使.NET的運(yùn)行層能完全發(fā)揮作用,它要求編程語(yǔ)言遵循某些特定的規(guī)則——其中之一就是所有的語(yǔ)言類型必須遵守通用類型系統(tǒng)(Common TypeSystem,CTS)。不幸的是,許多C++特性不能被CTS支持。例如,模板和類的多重繼承。 



Microsoft對(duì)這個(gè)問(wèn)題的答案是給C++提供可管理的擴(kuò)展(Managed Extensions,ME),這可以使C++遵守CTS。通過(guò)添加新的關(guān)鍵字來(lái)標(biāo)記C++類有CTS的屬性(例如.-gc表示垃圾回收)。但是在創(chuàng)建新的工程時(shí)很難講為什么MEC++會(huì)比C#更合適。就特征(feature)而言它們很相似,但與C++不同的是C#從一開(kāi)始就以.NET為環(huán)境設(shè)計(jì)的。MEC++存在的理由好像是將C++代碼移植(port)為.NET環(huán)境下的代碼。 



因此,這個(gè)問(wèn)題的答案,很可能是C++作為一個(gè).NET環(huán)境之外的語(yǔ)言將依然保留它的重要性;而通過(guò)ME將現(xiàn)存的C++代碼移植為適合.NET環(huán)境;但是很可能C#將是C++開(kāi)發(fā)者開(kāi)發(fā)新的.NET應(yīng)用程序的最好選擇。 



8. C#是面向?qū)ο蟮膯?   

是的,C#像Java和C++一樣,是一個(gè)面向?qū)ο蟮恼Z(yǔ)言。 



9. C#有自己的類庫(kù)嗎?   

不,就像所有的.NET語(yǔ)言(VB.Net,JScript .Net...)一樣,C#訪問(wèn).NET類庫(kù),C#沒(méi)有自己的類庫(kù)。 



基本類型 



1. C#提供什么標(biāo)準(zhǔn)類型?    

C#支持的基本類型和C++很相似,包括int, long, float, double, char, string, arrays,structs 和classes。然而,不要假設(shè)太多,名字可能很形似,但是一些細(xì)節(jié)不相同。例如C#中的long是64位的,而C++的long取決于平臺(tái),32位的平臺(tái)上是32位的,64位的平臺(tái)上是64位的。class和struct在C++中幾乎完全一樣,但在C#中并不是這樣的。 

  

2. 是否所有的C#類型都派生于一個(gè)公共的基類?
   

是,也不是,所有的對(duì)象都可以看作從Object(System.Object)派生而來(lái)。但是為了把像int,float這樣的值類型實(shí)例看作是從Object對(duì)象派生的,這個(gè)實(shí)例必須通過(guò)一個(gè)裝箱的操作(boxing)轉(zhuǎn)化為引用類型。理論上,開(kāi)發(fā)者可以忽略這些底層的轉(zhuǎn)化,但是認(rèn)識(shí)到這點(diǎn)對(duì)于系統(tǒng)性能影響很重要。 

  

3. 是否可以這樣認(rèn)為,可以將一個(gè)值類型的實(shí)例作為參數(shù)傳給以對(duì)象為參數(shù)的方法?
   

是的,例如:

class CApplication {
public static void Main() {
int x = 25;
string s = “fred”;
DisplayMe( x );
DisplayMe( s ); }

static void DisplayMe( object o ) {
System.Console.WriteLine( “You are {0}”, o ); }}



將顯示:

You are 25

You are fred 

  

4. 值類型和引用類型的最基本的區(qū)別是什么?
   

C#將類型分為兩類,一類是值類型,另一類是引用類型。大部分固有的基本類型(如int, char)是值類型,structs也是值類型。引用類型包括類、接口、數(shù)組和字符串?;镜母拍罘浅:?jiǎn)單,那就是一個(gè)值類型的實(shí)例代表了實(shí)際的數(shù)據(jù)(存在棧中),而一個(gè)引用類型的實(shí)例代表指向數(shù)據(jù)的指針或者引用(存在堆中)。 



C++開(kāi)發(fā)者最容易混淆的地方是:C#已經(jīng)自己預(yù)定義了一些類型作為值類型,一些作為引用類型,而一個(gè)C++的開(kāi)發(fā)者希望能夠自己控制。

例如,在C++中,我們可以這樣做:

int x1 = 3; // x1 是堆棧上的值

int *x2 = new int(3) // x2 是堆的一個(gè)值的引用

但是在C#中沒(méi)有這樣的控制:

int x1 = 3; // x1是堆棧上的值

int x2 = new int();

x2 = 3; // x2還是堆棧上的值! 
5. 既然 int是值類型,而 class是引用類型,那么int是怎樣從Object派生的呢?   

是這樣的,當(dāng)int用作int時(shí)候,這是一個(gè)值類型(在棧上),然而,當(dāng)它用作是Object時(shí),這是一個(gè)引用堆上的整數(shù)值的引用類型。換而言之,當(dāng)你將int看作對(duì)象時(shí),運(yùn)行層將它自動(dòng)轉(zhuǎn)化為對(duì)象引用,這個(gè)轉(zhuǎn)化過(guò)程稱作裝箱(boxing)。這個(gè)轉(zhuǎn)換包括將棧里的值拷貝到了堆里,并且新建了一個(gè)對(duì)象的實(shí)例來(lái)引用該值。拆箱操作(unboxing)是個(gè)反過(guò)程——將對(duì)象轉(zhuǎn)化為基于棧的值類型。

int x = 3;
// 堆棧上新的int類型,值為3
object objx = x;
// 堆上新的int, 設(shè)定值為3,x=3仍然在堆棧上
int y = (int)objx;
//新的int類型的值3在堆棧上,x=3在堆棧上,objx=3在堆上   

6. C#使用引用替代指針,那么C#的引用和C++的引用一樣嗎?
   

不完全,基本的思想是一樣的,但是一個(gè)重要的區(qū)別是C#的引用可以是null。因此你不能確認(rèn)C#的引用一定會(huì)是一個(gè)有效的對(duì)象。如果試圖使用一個(gè)值為null的引用,一個(gè)NullReferenceException 異常將被拋出。

例如,看一看以下的方法:

void displayStringLength( string s ) {
Console.WriteLine( “String is length {0}”, s.Length ); }

如果這樣調(diào)用它,這種方法將產(chǎn)生一個(gè)NullReferenceException 異常:
string s = null;
displayStringLength( s );
當(dāng)然有些情況你認(rèn)為產(chǎn)生這樣一個(gè)異常是完全可以接受的結(jié)果,但是在這個(gè)例子里最好按下面的代碼改寫(xiě)一下:

void displayStringLength( string s ) {
if( s == null )
Console.WriteLine(“String is null”);
else
Console.WriteLine(“String is length {0}”, s.Length );
}

class和struct 

1. struct在C++中是多余的,為什么C#還要使用它們呢?    

在C++中,一個(gè)結(jié)構(gòu)和一個(gè)類幾乎就是一個(gè)同樣的東西。唯一的區(qū)別是缺省的成員的訪問(wèn)級(jí)別不一樣(struct的缺省級(jí)別是public,class的缺省級(jí)別是private)。然而,在C#中struct和class完全不一樣。在C#中,struct是值類型,而class是引用類型。另外struct不能從其他struct或者class繼承,盡管struct可以實(shí)現(xiàn)接口。struct沒(méi)有析構(gòu)器。
2. C#支持多重繼承嗎?    

C#支持接口的多重繼承,但是不支持類的多重繼承。 

3. C#接口和C++抽象類一樣嗎?   

不,不完全。C++的抽象類不能被實(shí)例化。但是它可以(而且經(jīng)常是)包含執(zhí)行代碼和數(shù)據(jù)成員。一個(gè)C#接口不能包含任何執(zhí)行代碼或數(shù)據(jù)成員,它只是一組方法名稱和簽名(signature)。一個(gè)C#的接口更像是一個(gè)COM接口而不是抽象類。
另一個(gè)主要的不同點(diǎn)是:C#類只能從一個(gè)類(不管是否抽象)繼承,但可以實(shí)現(xiàn)多重接口。 

4. C#構(gòu)造器和C++ 構(gòu)造器是否相同?   

非常相似,但是它們絕對(duì)不同。第一,C#析構(gòu)器不保證在某個(gè)特定的時(shí)間被調(diào)用。實(shí)際上它根本不保證被調(diào)用。真實(shí)的情況是,C#析構(gòu)器只是一個(gè)偽裝了的Finalize方法。具體點(diǎn)講,它是一個(gè)插入調(diào)用基類Finalize方法的Finalize方法。因此,這段代碼:

class CTest {

~CTest() {

System.Console.WriteLine(“Bye bye” );

}
}

實(shí)際上就是:
class CTest {
protected override void Finalize() {
System.Console.WriteLine(“Bye bye” );
base.Finalize();
}   
}

如果你不相信,可以將一個(gè) Finalize方法和一個(gè)析構(gòu)器加入C#類中,然后就可以知道是如何編譯的了。 

5. 什么是靜態(tài)構(gòu)造器?
   

它是整個(gè)類的一個(gè)構(gòu)造器,而不是類的一個(gè)實(shí)例的構(gòu)造器,它在類裝載的時(shí)候被調(diào)用。 

6. C#中所有的方法都是虛方法嗎?
   

不,像C++一樣,缺省的時(shí)候,方法不是虛擬的,但都可以改為虛擬的。 

7. 怎樣在C#中聲明一個(gè)純虛函數(shù)?   

在方法前使用abstract修飾符,類也可以標(biāo)記為abstract(這是自然的)。注意,abstract方法不能有執(zhí)行代碼(不同于C++中純虛方法)。 

和C++處理的不同 

1. 我“new”了一個(gè)對(duì)象,但是我怎樣刪除它?   

你不能,不允許你顯式地調(diào)用析構(gòu)器,也沒(méi)有delete操作符。但是不必?fù)?dān)心,垃圾回收(garbage collection)會(huì)釋放你的對(duì)象,最終會(huì)的(也許會(huì)的)。 

2. 我試圖在棧上建立一個(gè)對(duì)象,但是C#編譯器不通過(guò),這是怎么回事?    

和C++不同,你不能在棧上建立一個(gè)對(duì)象的實(shí)例。類的實(shí)例總是被建立在堆上并且接受垃圾回收器(garbage collection)的管理。 

3. 我定義了一個(gè)析構(gòu)器,但是它從來(lái)不能被調(diào)用,為什么?    

一個(gè)C#析構(gòu)器實(shí)際上是Finalize方法的實(shí)現(xiàn),但是運(yùn)行環(huán)境不保證調(diào)用Finalize方法。你可以考慮通過(guò)調(diào)用GC.RequestFinalizeOnShutdown()方法試一下。 

4. 大多數(shù)的C#基本類型和C++的基本類型有相同的名字,它們一樣嗎?
   

不,C#中char和C++中的wchar是相同的。C#中所有的字符包括字符串都是Unicode的,C#中整型值是固定大小的,而在C++中其大小取決于處理器。例如,一個(gè)C#的int是32位的,而C++中int在32-bit處理器上是32位的,在64-bit處理器上是64位的,一個(gè)C#的long是64位的。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C# 值類型與引用類型 (上)
C#中Struct和Class的區(qū)別
.NET基礎(chǔ)拾遺(1)類型語(yǔ)法基礎(chǔ)和內(nèi)存管理基礎(chǔ)
結(jié)構(gòu)struct注意項(xiàng)
堆棧和委托堆的區(qū)別(c#)一
[你必須知道的.NET] 第五回:深入淺出關(guān)鍵字---把new說(shuō)透
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服