日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c++,c.c#区别

發(fā)布時間:2023/12/10 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++,c.c#区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C++則一般看作是對C語言的擴展。
Java語言是一種完全的面向?qū)ο笳Z言,雖然它的底層(運行時庫)是用C語言開發(fā)的,可是并不依賴于C。
C#是微軟開發(fā)的一種編程語言,語法類似Java,幾乎就是從Java的翻版。
C/C++的優(yōu)點在于與底層比較接近,可以控制的粒度更加精細,是開發(fā)系統(tǒng)級應(yīng)用的最佳選擇。關(guān)于缺點,我想正是源于其優(yōu)點,因為它們能控制的編程元素粒度精細,所以編程比較困難,煩瑣,容易出錯。
Java和C#都比較高級,可以看作高級語言的高級語言,優(yōu)點是開發(fā)容易,但運行效率不如更為底層的C/C++。
具體選擇使用的時候,可以根據(jù)實際的項目需要選擇。運行效率要求高的,底層控制要求高的用C/C++,否則可以選擇Java或C#;跨平臺的要求高的可以用Java。
C/C++穩(wěn)定,靈活,高效 ——————各種大型應(yīng)用程序、系統(tǒng)的編寫,底層的開發(fā)——包括操作系統(tǒng),內(nèi)核功能的編寫等;
JAVA:高效,體積小,可移植性——————硬件驅(qū)動的編寫,嵌入式程序,手機應(yīng)用程序,網(wǎng)絡(luò)小程序等各種需要在可使用資源較少的功能不太復(fù)雜的程序;
.NET:開發(fā)周期短,代碼復(fù)用率高,安全性好——————————WebSite及web服務(wù)編程;
C#:開發(fā)周期短,對網(wǎng)絡(luò)和數(shù)據(jù)訪問功能——————————各種和網(wǎng)絡(luò)有關(guān)的Applications;

C#、C++和Java
C#的語言規(guī)范由Microsoft的Anders Hejlsberg與Scott Wiltamuth編寫。在當前Microsoft天花亂墜的宣傳中,對C#和C++、Java作一番比較總是很有趣的。考慮到當前IT媒體的輿論傾向,如果你早就知道C#更接近Java而不是C++,事情也不值得大驚小怪。對于剛剛加入這場討論的讀者,下面的表1讓你自己作出判斷。顯然,結(jié)論應(yīng)該是:Java和C#雖然不是孿生子,但C#最主要的特色卻更接近Java而不是C++。

了解表1總結(jié)的重要語言功能之后,請繼續(xù)往下閱讀,了解C#和Java的一些重要區(qū)別。
語言規(guī)范的比較
2.1、簡單數(shù)據(jù)類型

簡單數(shù)據(jù)類型(Primitive)在C#中稱為值類型,C#預(yù)定義的簡單數(shù)據(jù)類型比Java多。例如,C#有unit,即無符號整數(shù)。表2列出了所有C#的預(yù)定義數(shù)據(jù)類型:

2.2、常量
忘掉Java中的static final修飾符。在C#中,常量可以用const關(guān)鍵詞聲明。
[csharp]

  • public const int x = 55;
    此外,C#的設(shè)計者還增加了readonly關(guān)鍵詞。如果編譯器編譯時未能確定常量值,你可以使用readonly關(guān)鍵詞。readonly域只能通過初始化器或類的構(gòu)造函數(shù)設(shè)置。
  • 2.3、公用類的入口點
    在Java中,公用類的入口點是一個名為main的公用靜態(tài)方法。main方法的參數(shù)是String對象數(shù)組,它沒有返回值。在C#中,main方法變成了公用靜態(tài)方法Main(大寫的M),Main方法的參數(shù)也是一個String對象數(shù)組,而且也沒有返回值,如下面的原型聲明所示:
    [csharp]

  • public static void Main(String[] args)
    但是,C#的Main方法不局限于此。如果不向Main方法傳遞任何參數(shù),你可以使用上述Main方法的一個重載版本,即不帶參數(shù)列表的版本。也就是說,下面的Main方法也是一個合法的入口點:
    [csharp]

  • public static void Main()
    另外,如果你認為有必要的話,Main方法還可以返回一個int。例如,下面代碼中的Main方法返回1:
    [csharp]

  • using System;

  • public class Hello {

  • public static int Main() {

  • Console.WriteLine(“Done”);

  • return 1;

  • }

  • }
    與此相對,在Java中重載main方法是不合法的。

  • 2.4、switch語句
    在Java中,switch語句只能處理整數(shù)。但C#中的switch語句不同,它還能夠處理字符變量。請考慮下面用switch語句處理字符串變量的C#代碼:
    [csharp]

  • using System;
  • public class Hello {
  • public static void Main(String[] args) {
  • switch (args[0]) {
  • case “老板”:
  • Console.WriteLine(“早上好!我們隨時準備為您效勞!”);
  • break;
  • case “雇員”:
  • Console.WriteLine(“早上好!你可以開始工作了!”);
  • break;
  • default:
  • Console.WriteLine(“早上好!祝你好運!”);
  • break;
  • }
  • }
  • }
    與Java中的switch不同,C#的switch語句要求每一個case塊或者在塊的末尾提供一個break語句,或者用goto轉(zhuǎn)到switch內(nèi)的其他case標簽。
  • 2.5、foreach語句
    foreach語句枚舉集合中的各個元素,為集合中的每一個元素執(zhí)行一次代碼塊。請參見下面的例子。
    [csharp]

  • using System;

  • public class Hello {

  • public static void Main(String[] args) {

  • foreach (String arg in args)

  • Console.WriteLine(arg);

  • }

  • }
    如果在運行這個執(zhí)行文件的時候指定了參數(shù),比如“Hello Peter Kevin Richard”,則程序的輸出將是下面幾行文字:
    [csharp]

  • Peter

  • Kevin

  • Richard

  • 2.6、C#沒有>>>移位操作符
    C#支持uint和ulong之類的無符號變量類型。因此,在C#中,右移操作符(即“>>”)對于無符號變量類型和帶符號變量類型(比如int和long)的處理方式不同。右移uint和ulong丟棄低位并把空出的高位設(shè)置為零;但對于int和long類型的變量,“>>”操作符丟棄低位,同時,只有當變量值是正數(shù)時,“>>”才把空出的高位設(shè)置成零;如果“>>”操作的是一個負數(shù),空出的高位被設(shè)置成為1。

    Java中不存在無符號的變量類型。因此,我們用“>>>”操作符在右移時引入負號位;否則,使用“>>”操作符。

    2.7、goto關(guān)鍵詞
    Java不用goto關(guān)鍵詞。在C#中,goto允許你轉(zhuǎn)到指定的標簽。不過,C#以特別謹慎的態(tài)度對待goto,比如它不允許goto轉(zhuǎn)入到語句塊的內(nèi)部。在Java中,你可以用帶標簽的語句加上break或continue取代C#中的goto。

    2.8、聲明數(shù)組
    在Java中,數(shù)組的聲明方法非常靈活,實際上有許多種聲明方法都屬于合法的方法。例如,下面的幾行代碼是等價的:
    [java]

  • int[] x = { 0, 1, 2, 3 };
  • int x[] = { 0, 1, 2, 3 };
    但在C#中,只有第一行代碼合法,[]不能放到變量名字之后。
  • 2.9、包
    在C#中,包(Package)被稱為名稱空間。把名稱空間引入C#程序的關(guān)鍵詞是“using”。例如,“using System;”這個語句引入了System名稱空間。

    然而,與Java不同的是,C#允許為名稱空間或者名稱空間中的類指定別名:
    [csharp]

  • using TheConsole = System.Console;
  • public class Hello {
  • public static void Main() {
  • TheConsole.WriteLine(“使用別名”);
  • }
  • }
    雖然從概念上看,Java的包類似于.NET的名稱空間。然而,兩者的實現(xiàn)方式不同。在Java中,包的名字同時也是實際存在的實體,它決定了放置.java文件的目錄結(jié)構(gòu)。在C#中,物理的包和邏輯的名稱之間是完全分離的,也就是說,名稱空間的名字不會對物理的打包方式產(chǎn)生任何影響。在C#中,每一個源代碼文件可以從屬于多個名稱空間,而且它可以容納多個公共類。
  • .NET中包的實體稱為程序集(Assembly)。每一個程序集包含一個manifest結(jié)構(gòu)。manifest列舉程序集所包含的文件,控制哪些類型和資源被顯露到程序集之外,并把對這些類型和資源的引用映射到包含這些類型與資源的文件。程序集是自包含的,一個程序集可以放置到單一的文件之內(nèi),也可以分割成多個文件。.NET的這種封裝機制解決了DLL文件所面臨的問題,即臭名昭著的DLL Hell問題。

    2.10、默認包
    在Java中,java.lang包是默認的包,它無需顯式導(dǎo)入就已經(jīng)自動包含。例如,要把一些文本輸出到控制臺,你可以使用下面的代碼:
    [java]

  • System.out.println(“Hello world from Java”);
    C#中不存在默認的包。如果要向控制臺輸出文本,你使用System名稱空間Console對象的WriteLine方法。但是,你必須顯式導(dǎo)入所有的類。代碼如下:
    [csharp]

  • using System;

  • public class Hello {

  • public static void Main() {

  • Console.WriteLine(“Hello world from C#”);

  • }

  • }
    2.11、面向?qū)ο?br /> Java和C#都是完全面向?qū)ο蟮恼Z言。在面向?qū)ο缶幊痰娜笤瓌t方面,這兩種語言接近得不能再接近。

  • 繼承:這兩種語言都支持類的單一繼承,但類可以實現(xiàn)多個接口。所有類都從一個公共的基類繼承。
    封裝與可見性:無論是在Java還是C#中,你都可以決定類成員是否可見。除了C#的internal訪問修飾符之外,兩者的可見性機制非常相似。
    多態(tài)性:Java和C#都支持某些形式的多態(tài)性機制,且兩者實現(xiàn)方法非常類似。
    2.12、可訪問性
    類的每個成員都有特定類型的可訪問性。C#中的訪問修飾符與Java中的基本對應(yīng),但多出了一個internal。簡而言之,C#有5種類型的可訪問性,如下所示:

    public:成員可以從任何代碼訪問。
    protected:成員只能從派生類訪問。
    internal:成員只能從同一程序集的內(nèi)部訪問。
    protected internal:成員只能從同一程序集內(nèi)的派生類訪問。
    private:成員只能在當前類的內(nèi)部訪問。
    2.13、派生類
    在Java中,我們用關(guān)鍵詞“extends”實現(xiàn)繼承。C#采用了C++的類派生語法。例如,下面的代碼顯示了如何派生父類Control從而創(chuàng)建出新類Button:

    [java]

  • public class Button: Control { . . }
  • 2.14、最終類
    由于C#中不存在final關(guān)鍵詞,如果想要某個類不再被派生,你可以使用sealed關(guān)鍵詞,如下例所示:

    sealed class FinalClass { . . }

    2.15、接口
    接口這個概念在C#和Java中非常相似。接口的關(guān)鍵詞是interface,一個接口可以擴展一個或者多個其他接口。按照慣例,接口的名字以大寫字母“I”開頭。下面的代碼是C#接口的一個例子,它與Java中的接口完全一樣:
    [csharp]

  • interface IShape { void Draw(); }
    擴展接口的語法與擴展類的語法一樣。例如,下例的IRectangularShape接口擴展IShape接口(即,從IShape接口派生出IRectangularShape接口)
    [csharp]

  • interface IRectangularShape: IShape { int GetWidth(); }
    如果你從兩個或者兩個以上的接口派生,父接口的名字列表用逗號分隔,如下面的代碼所示:
    [csharp]

  • interface INewInterface: IParent1, IParent2 { }
    然而,與Java不同,C#中的接口不能包含域(Field)。

  • 另外還要注意,在C#中,接口內(nèi)的所有方法默認都是公用方法。在Java中,方法聲明可以帶有public修飾符(即使這并非必要),但在C#中,顯式為接口的方法指定public修飾符是非法的。例如,下面的C#接口將產(chǎn)生一個編譯錯誤。
    [csharp]

  • interface IShape { public void Draw(); }
  • 2.16、is和as操作符
    C#中的is操作符與Java中的instanceof操作符一樣,兩者都可以用來測試某個對象的實例是否屬于特定的類型。在Java中沒有與C#中的as操作符等價的操作符。as操作符與is操作符非常相似,但它更富有“進取心”:如果類型正確的話,as操作符會嘗試把被測試的對象引用轉(zhuǎn)換成目標類型;否則,它把變量引用設(shè)置成null。

    為正確理解as操作符,首先請考慮下面這個例子中is操作符的運用。這個例子包含一個IShape接口,以及兩個實現(xiàn)了IShape接口的類Rectangle和Circle。
    [csharp]

  • using System;
  • interface IShape {
  • void draw();
  • }
  • public class Rectangle: IShape {
  • public void draw() {
  • }
  • public int GetWidth() {
  • return 6;
  • }
  • }
  • public class Circle: IShape {
  • public void draw() {
  • }
  • public int GetRadius() {
  • return 5;
  • }
  • }
  • public class LetsDraw {
  • public static void Main(String[] args) {
  • IShape shape = null;
  • if (args[0] == “rectangle”) {
  • shape = new Rectangle();
  • }
  • else if (args[0] == “circle”) {
  • shape = new Circle();
  • }
  • if (shape is Rectangle) {
  • Rectangle rectangle = (Rectangle) shape;
  • Console.WriteLine("Width : " + rectangle.GetWidth());
  • }
  • if (shape is Circle) {
  • Circle circle = (Circle) shape;
  • Console.WriteLine("Radius : " + circle.GetRadius());
  • }
  • }
  • }
  • 編譯好代碼之后,用戶可以輸入“rectangle”或者“circle”作為Main方法的參數(shù)。如果用戶輸入的是“circle”,則shape被實例化成為一個Circle類型的對象;反之,如果用戶輸入的是“rectangle”,則shape被實例化成為Rectangle類型的對象。隨后,程序用is操作符測試shape的變量類型:如果shape是一個矩形,則shape被轉(zhuǎn)換成為Rectangle對象,我們調(diào)用它的GetWidth方法;如果shape是一個圓,則shape被轉(zhuǎn)換成為一個Circle對象,我們調(diào)用它的GetRadius方法。

    如果使用as操作符,則上述代碼可以改成如下形式:

    [csharp]

  • using System;
  • interface IShape {
  • void draw();
  • }
  • public class Rectangle: IShape {
  • public void draw() {
  • }
  • public int GetWidth() {
  • return 6;
  • }
  • }
  • public class Circle: IShape {
  • public void draw() {
  • }
  • public int GetRadius() {
  • return 5;
  • }
  • }
  • public class LetsDraw {
  • public static void Main(String[] args) {
  • IShape shape = null;
  • if (args[0] == “rectangle”) {
  • shape = new Rectangle();
  • }
  • else if (args[0] == “circle”) {
  • shape = new Circle();
  • }
  • Rectangle rectangle = shape as Rectangle;
  • if (rectangle != null) {
  • Console.WriteLine("Width : " + rectangle.GetWidth());
  • }
  • else {
  • Circle circle = shape as Circle;
  • if (circle != null)
  • Console.WriteLine("Radius : " + circle.GetRadius());
  • }
  • }
  • }
  • 在上面代碼的粗體部分中,我們在沒有測試shape對象類型的情況下,就用as操作符把shape轉(zhuǎn)換成Rectangle類型的對象。如果shape正好是一個Rectangle,則shape被轉(zhuǎn)換成為Rectangle類型的對象并保存到rectangle變量,然后我們調(diào)用它的GetWidth方法。如果這種轉(zhuǎn)換失敗,則我們進行第二次嘗試。這一次,shape被轉(zhuǎn)換成為Circle類型的對象并保存到circle變量。如果shape確實是一個Circle對象,則circle現(xiàn)在引用了一個Circle對象,我們調(diào)用它的GetRadius方法。

    2.17、庫
    C#沒有自己的類庫。但是,C#共享了.NET的類庫。當然,.NET類庫也可以用于其他.NET語言,比如VB.NET或者JScript.NET。值得一提的是StringBuilder類,它是對String類的補充。StringBuilder類與Java的StringBuffer類非常相似。

    2.18、垃圾收集
    C++已經(jīng)讓我們認識到手工管理內(nèi)存是多么缺乏效率和浪費時間。當你在C++中創(chuàng)建了一個對象,你就必須手工地拆除這個對象。代碼越復(fù)雜,這個任務(wù)也越困難。Java用垃圾收集器來解決這個問題,由垃圾收集器搜集不再使用的對象并釋放內(nèi)存。C#同樣采用了這種方法。應(yīng)該說,如果你也在開發(fā)一種新的OOP語言,追隨這條道路是一種非常自然的選擇。C#仍舊保留了C++的內(nèi)存手工管理方法,它適合在速度極端重要的場合使用,而在Java中這是不允許的。

    2.19、異常處理
    如果你聽說C#使用與Java相似的異常處理機制,你不會為此而驚訝,對吧?在C#中,所有的異常都從一個名為Exception的類派生(聽起來很熟悉?)另外,正如在Java中一樣,你還有熟悉的try和catch語句。Exception類屬于.NET System名稱空間的一部分。

    Java沒有的功能
    C#出生在Java成熟之后,因此,C#擁有一些Java(目前)還沒有的絕妙功能也就不足為奇。

    3.1、枚舉器
    枚舉器即enum類型(Enumerator,或稱為計數(shù)器),它是一個相關(guān)常量的集合。精確地說,enum類型聲明為一組相關(guān)的符號常量定義了一個類型名字。例如,你可以創(chuàng)建一個名為Fruit(水果)的枚舉器,把它作為一個變量值的類型使用,從而把變量可能的取值范圍
    [csharp]

  • public class Demo {
  • public enum Fruit {
  • Apple, Banana, Cherry, Durian
  • }
  • public void Process(Fruit fruit) {
  • switch (fruit) {
  • case Fruit.Apple:
  • break;
  • case Fruit.Banana:
  • break;
  • case Fruit.Cherry:
  • break;
  • case Fruit.Durian:
  • break;
  • }
  • }
  • }
    在上例的Process方法中,雖然你可以用int作為myVar變量的類型,但是,使用枚舉器Fruit之后,變量的取值范圍限制到了Applet、Banana、Cherry和Durian這幾個值之內(nèi)。與int相比,enum的可讀性更好,自我說明能力更強。
  • 3.2、結(jié)構(gòu)
    結(jié)構(gòu)(Struct)與類很相似。然而,類是作為一種引用類型在堆中創(chuàng)建,而結(jié)構(gòu)是一種值類型,它存儲在棧中或者是嵌入式的。因此,只要謹慎運用,結(jié)構(gòu)要比類快。結(jié)構(gòu)可以實現(xiàn)接口,可以象類一樣擁有成員,但結(jié)構(gòu)不支持繼承。

    然而,簡單地用結(jié)構(gòu)來取代類可能導(dǎo)致慘重損失。這是因為,結(jié)構(gòu)是以值的方式傳遞,由于這種傳遞方式要把值復(fù)制到新的位置,所以傳遞一個“肥胖的”結(jié)構(gòu)需要較大的開銷。而對于類,傳遞的時候只需傳遞它的引用。

    下面是一個結(jié)構(gòu)的例子。注意它與類非常相似,只要把單詞“struct”替換成“class”,你就得到了一個類。

    [csharp]

  • struct Point {
  • public int x, y;
  • public Point(int x, int y) {
  • this.x = x;
  • this.y = y;
  • }
  • }
  • 3.3、屬性
    C#類除了可以擁有域(Field)之外,它還可以擁有屬性(Property)。屬性是一個與類或?qū)ο箨P(guān)聯(lián)的命名的特征。屬性是域的一種自然擴展——兩者都是有類型、有名字的類成員。然而,和域不同的是,屬性不表示存儲位置;相反,屬性擁有存取器(accessor),存取器定義了讀取或者寫入屬性值時必須執(zhí)行的代碼。因此,屬性提供了一種把動作和讀取、寫入對象屬性值的操作關(guān)聯(lián)起來的機制,而且它們允許屬性值通過計算得到。

    在C#中,屬性通過屬性聲明語法定義。屬性聲明語法的第一部分與域聲明很相似,第二部分包括一個set過程和/或一個get過程。例如,在下面的例子中,PropertyDemo類定義了一個Prop屬性。
    [csharp]

  • public class PropertyDemo {
  • private string prop;
  • public string Prop {
  • get {
  • return prop;
  • }
  • set {
  • prop = value;
  • }
  • }
  • }
    如果屬性既允許讀取也允許寫入,如PropertyDemo類的Prop屬性,則它同時擁有g(shù)et和set存取過程。當我們讀取屬性的值時,get存取過程被調(diào)用;當我們寫入屬性值時,set存取過程被調(diào)用。在set存取過程中,屬性的新值在一個隱含的value參數(shù)中給出。
  • 與讀取和寫入域的方法一樣,屬性也可以用同樣的語法讀取和寫入。例如,下面的代碼實例化了一個PropertyDemo類,然后寫入、讀取它的Prop屬性。
    [csharp]

  • PropertyDemo pd = new PropertyDemo();
  • pd.Prop = “123”; // set
  • string s = pd.Prop; // get
  • 3.4、以引用方式傳遞簡單數(shù)據(jù)類型的參數(shù)
    在Java中,當你把一個簡單數(shù)據(jù)類型的值作為參數(shù)傳遞給方法時,參數(shù)總是以值的方式傳遞——即,系統(tǒng)將為被調(diào)用的方法創(chuàng)建一個參數(shù)值的副本。在C#中,你可以用引用的方式傳遞一個簡單數(shù)據(jù)類型的值。此時,被調(diào)用的方法將直接使用傳遞給它的那個值——也就是說,如果在被調(diào)用方法內(nèi)部修改了參數(shù)的值,則原來的變量值也隨之改變。

    在C#中以引用方式傳遞值時,我們使用ref關(guān)鍵詞。例如,如果編譯并運行下面的代碼,你將在控制臺上看到輸出結(jié)果16。注意i值被傳遞給ProcessNumber之后是如何被改變的。
    [csharp]

  • using System;

  • public class PassByReference {

  • public static void Main(String[] args) {

  • int i = 8;

  • ProcessNumber(ref i);

  • Console.WriteLine(i);

  • }

  • public static void ProcessNumber(ref int j) {

  • j = 16;

  • }

  • }
    C#中還有一個允許以引用方式傳遞參數(shù)的關(guān)鍵詞out,它與ref相似。但是,使用out時,作為參數(shù)傳遞的變量在傳遞之前不必具有已知的值。在上例中,如果整數(shù)i在傳遞給ProcessNumber方法之前沒有初始化,則代碼將出錯。如果用out來取代ref,你就可以傳遞一個未經(jīng)初始化的值,如下面這個修改后的例子所示。
    [csharp]

  • using System;

  • public class PassByReference {

  • public static void Main(String[] args) {

  • int i;

  • ProcessNumber(out i);

  • Console.WriteLine(i);

  • }

  • public static void ProcessNumber(out int j) {

  • j = 16;

  • }

  • }

  • 經(jīng)過修改之后,雖然i值在傳遞給ProcessNumber方法之前沒有初始化,但PassByReference類能夠順利通過編譯。

    3.5、C#保留了指針
    對于那些覺得自己能夠恰到好處地運用指針并樂意手工進行內(nèi)存管理的開發(fā)者來說,在C#中,他們?nèi)耘f可以用既不安全也不容易使用的“古老的”指針來提高程序的性能。C#提供了支持“不安全”(unsafe)代碼的能力,這種代碼能夠直接操作指針,能夠“固定”對象以便臨時地阻止垃圾收集器移動對象。無論從開發(fā)者還是用戶的眼光來看,這種對“不安全”代碼的支持其實是一種安全功能。“不安全”的代碼必須用unsafe關(guān)鍵詞顯式地標明,因此開發(fā)者不可能在無意之中使用“不安全”的代碼。同時,C#編譯器又和執(zhí)行引擎協(xié)作,保證了“不安全”的代碼不能偽裝成為安全代碼。

    [csharp]

  • using System;
  • class UsePointer {
  • unsafe static void PointerDemo(byte[] arr) {
  • .
  • .
  • }
  • }
  • C#中的unsafe代碼適合在下列情形下使用:當速度極端重要時,或者當對象需要與現(xiàn)有的軟件(比如COM對象或者DLL形式的C代碼)交互時。

    3.6、代理
    代理(delegate)可以看作C++或者其他語言中的函數(shù)指針。然而,與函數(shù)指針不同的是,C#中的代理是面向?qū)ο蟮摹㈩愋桶踩摹⒖煽康摹6?#xff0c;函數(shù)指針只能用來引用靜態(tài)函數(shù),但代理既能夠引用靜態(tài)方法,也能夠引用實例方法。代理用來封裝可調(diào)用方法。你可以在類里面編寫方法并在該方法上創(chuàng)建代理,此后這個代理就可以被傳遞到第二個方法。這樣,第二個方法就可以調(diào)用第一個方法。

    代理是從公共基類System.Delegate派生的引用類型。定義和使用代理包括三個步驟:聲明,創(chuàng)建實例,調(diào)用。代理用delegate聲明語法聲明。例如,一個不需要參數(shù)且沒有返回值的代理可以用如下代碼聲明:
    [csharp]

  • delegate void TheDelegate();
    創(chuàng)建代理實例的語法是:使用new關(guān)鍵詞,并引用一個實例或類方法,該方法必須符合代理指定的特征。一旦創(chuàng)建了代理的實例,我們就可以用調(diào)用方法的語法調(diào)用它。
  • 3.7、包裝和解除包裝
    在面向?qū)ο蟮木幊陶Z言中,我們通常使用的是對象。但為了提高速度,C#也提供了簡單數(shù)據(jù)類型。因此,C#程序既包含一大堆的對象,又有大量的值。在這種環(huán)境下,讓這兩者協(xié)同工作始終是一個不可回避的問題,你必須要有一種讓引用和值進行通信的方法。

    在C#以及.NET運行時環(huán)境中,這個“通信”問題通過包裝(Boxing)和解除包裝(Unboxing)解決。包裝是一種讓值類型看起來象引用類型的處理過程。當一個值類型(簡單數(shù)據(jù)類型)被用于一個要求或者可以使用對象的場合時,包裝操作自動進行。包裝一個value-type值的步驟包括:分配一個對象實例,然后把value-type值復(fù)制到對象實例。

    解除包裝所執(zhí)行的動作與包裝相反,它把一個引用類型轉(zhuǎn)換成值類型。解除包裝操作的步驟包括:首先檢查并確認對象實例確實是給定value-type的一個經(jīng)過包裝的值,然后從對象實例復(fù)制出值。

    Java對該問題的處理方式略有不同。Java為每一種簡單數(shù)據(jù)類型提供了一個對應(yīng)的類封裝器。例如,用Integer類封裝int類型,用Byte類封裝byte類型。

    總結(jié)

    以上是生活随笔為你收集整理的c++,c.c#区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: av黄色在线观看 | 456亚洲影院| 色香蕉网站 | 精品一区二区三区在线观看 | 国产精品1页 | 日本一区二区三区免费电影 | 91视频黄色| 欧美黑人精品一区二区 | av免费网站观看 | 久久成人免费网站 | 啪网址 | 国产成人手机在线 | av手机免费观看 | 中文字幕视频在线播放 | 91小宝寻花一区二区三区 | 成年人免费网 | 亚洲两性视频 | 69福利视频 | 亚洲福利小视频 | 国产在线视频导航 | 日本特黄网站 | 亚洲性视频 | 国产激情网站 | 久久窝窝| 日本亚洲欧洲色 | 视频在线免费 | 国产a网站| 亚洲成人一二三 | 香蕉视频在线播放 | 玖玖爱av | 第一页综合 | 国产在线观看一区二区三区 | 夜夜操av| 丰满护士巨好爽好大乳 | 久久久久亚洲av成人无码电影 | 日韩视频中文 | h片免费观看 | 一级淫片在线观看 | 国精品一区 | 亚洲人交配视频 | 亚洲天堂视频在线 | 丁香激情六月 | 丁香久久综合 | 国产成人精品一区二区在线小狼 | 女生张开腿让男生插 | 精品视频区 | 日批在线观看视频 | 亚洲精品不卡 | 久久久九九九热 | 综合色影院 | 福利电影一区二区三区 | 国产精品aaa| 热热久 | 国产精品一区久久 | 久久成人视屏 | 三上悠亚中文字幕在线播放 | 梦梦电影免费高清在线观看 | 在线观看免费的av | 亚洲色图在线视频 | 一级片免费网站 | 色爱av| 午夜精彩视频 | 在线播放免费av | 欧美.com | 久久久亚洲| 免费看美女被靠到爽的视频 | 欧美91成人网 | 欧美日韩视频在线观看免费 | 自拍偷拍1 | 午夜国产福利视频 | 国产熟女一区二区三区五月婷 | 国产精品久久AV无码 | 亚洲熟妇无码一区二区三区导航 | 国产传媒一区二区三区 | 亚洲AV无码国产精品午夜字幕 | 伊人激情综合网 | 亚洲在线色 | 国内精品99| 亚洲一区在线观看视频 | 日韩精品一区二区在线播放 | 黄色三级三级三级三级 | 不卡视频一区二区 | av在线黄 | 国产成人99久久亚洲综合精品 | 国产不卡网 | 国产精品人妻一区二区三区 | 欧美一区二区在线 | 大香伊人中文字幕精品 | 嫩草av久久伊人妇女超级a | 国产精品有限公司 | 超级碰在线观看 | 在线免费观看黄网站 | 亚洲精品二三区 | 毛片久久久久久久 | 色倩网站| 午夜精品久久久久久久91蜜桃 | 国产精彩视频一区 | 久久久久久网 | 天堂久久久久 |