日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

A Comparative Overview of C#中文版(3)

A Comparative Overview of C#中文版(3)

更新時(shí)間:2022-05-04 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

10.操作符重載
 利用操作符重載機(jī)制,程序員可以創(chuàng)建讓人感覺自然的好似簡單類型(如int、long等等)的類。C#實(shí)現(xiàn)了一個(gè)C++操作符重載的限制版,它可以使諸如這樣的精辟的例子—復(fù)數(shù)類操作符重載表現(xiàn)良好。
 在C#中,操作符==是對象類的非虛的(操作符不可以為虛的)方法,它是按引用比較的。當(dāng)你構(gòu)建一個(gè)類時(shí),你可以定義你自己的==操作符。如果你在集合中使用你的類,你應(yīng)該實(shí)現(xiàn)IComparable接口。這個(gè)接口有一個(gè)叫CompareTo(object)方法,如果“this”大于、小于或等于這個(gè)object,它應(yīng)該相應(yīng)返回正數(shù)、負(fù)數(shù)或0。如果你希望用戶能夠用優(yōu)雅的語法使用你的類,你可以選擇定義<、<=、>=、>方法。數(shù)值類型(int、long等等)實(shí)現(xiàn)了IComparable接口。
 下面是一個(gè)如何處理等于和比較操作的簡單例子:
public class Score : IComparable
{
int value;
public Score (int score)
{
value = score;
}
public static bool operator == (Score x, Score y)
{
return x.value == y.value;
}
public static bool operator != (Score x, Score y)
{
return x.value != y.value;
}
public int CompareTo (object o)
{
return value - ((Score)o).value;
}
}
Score a = new Score (5);
Score b = new Score (5);
Object c = a;
Object d = b;
按引用比較a和b:
System.Console.WriteLine ((object)a == (object)b; // 結(jié)果為false
【譯注:上句代碼應(yīng)該為:System.Console.WriteLine ((object)a == (object)b); // 結(jié)果為false】
比較a和b的值:
System.Console.WriteLine (a == b); // 結(jié)果為true
按引用比較c和d:
System.Console.WriteLine (c == d); // 結(jié)果為false
比較c和d的值:
System.Console.WriteLine (((IComparable)c).CompareTo (d) == 0); // 結(jié)果為true
你還可以向Score類添加<、<=、>=、>操作符。C#在編譯期保證邏輯上要成對出現(xiàn)的操作符(!=和==、>和<、>=和<=)必須一起被定義。
11.多態(tài)
 面向?qū)ο蟮恼Z言使用虛方法表達(dá)多態(tài)。這就意味著派生類可以有和父類具有同樣簽名的方法,并且父類可以調(diào)用派生類的方法【譯注:此處應(yīng)該是對象(或?qū)ο笠谩⒅赶驅(qū)ο蟮闹羔槪俊T贘ava中,缺省情況下方法就是虛的。在C#中,必須使用virtual關(guān)鍵字才能使方法被父類調(diào)用。
 在C#中,還需要override關(guān)鍵字以指明一個(gè)方法將重載(或?qū)崿F(xiàn)一個(gè)抽象方法)其父類的方法。
Class B//【譯注:應(yīng)為class B】
{
public virtual void foo () {}
}
Class D : B //【譯注:應(yīng)為class D : B】
{
public override void foo () {}
}
試圖重載一個(gè)非虛的方法將會(huì)導(dǎo)致一個(gè)編譯時(shí)錯(cuò)誤,除非對該方法加上“new”關(guān)鍵字,以指明該方法意欲隱藏父類的方法。
Class N : D //【譯注:應(yīng)為class N : D】
{
public new void foo () {}
}
N n = new N ();
n.foo(); // 調(diào)用N的foo
((D)n).foo(); // 調(diào)用D的foo
((B)n).foo(); // 調(diào)用D的foo
和C++、Java相比,C#的override關(guān)鍵字使得閱讀源代碼時(shí)可以清晰地看出哪些方法是重載的。不過,使用虛方法有利有弊。第一個(gè)有利點(diǎn)是:避免使用虛方法輕微的提高了執(zhí)行速度。第二點(diǎn)是可以清楚地知道哪些方法會(huì)被重載。【譯注:從“不過”至此,這幾句話顯然不合邏輯,但原文就是如此:“However, requiring the use of the virtual method has its pros and cons. The first pro is that is the slightly increased execution speed from avoiding virtual methods. The second pro is to make clear what methods are intended to be overridden.”。我認(rèn)為,若將被我標(biāo)為斜體的method改為keyword的話,邏輯上會(huì)順暢些。這樣,第一句話就可認(rèn)為是和Java比,因其方法缺省是虛的,第二句話主要就是和C++比,原因參見我后面的相關(guān)注釋】。然而,利也可能是弊。和Java中缺省忽略final修飾符【譯注:在Java中可利用final關(guān)鍵字,對方法上鎖,相當(dāng)于C#/C++中沒有用virtual關(guān)鍵字修飾方法/成員函數(shù)的情況】以及C++中缺省忽略virtual修飾符相比,Java中缺省選項(xiàng)【譯注:即虛的】使得你程序略微損失一些效率,而在C++中,它可能妨礙了擴(kuò)展性,雖然這對基類的實(shí)現(xiàn)者來說,是不可預(yù)料的。
【譯注:“而在C++中,它可能妨礙了擴(kuò)展性”這句話或許該這么理解:
class ParentCls
{
public:
 virtual void f(); 
};
/////////////////////////////////////////////////////////////////////////////
class ChildCls : public ParentCls
{
public:
 /*virtual*/ void f();/* 此處不標(biāo)明為virtual的也是virtual的,但是GrandChildCls并不知道(假定GrandChildCls看不到ParentCls),它不知道應(yīng)該對該方法overload(當(dāng)然C++中并overload關(guān)鍵字,它是Object Pascal的,這兒再插一句話,overload和override兩詞翻譯都一直都很混亂,Borland官方中文簡體手冊上都翻譯成“重載”)還是override,還是不能碰。即它不知道多態(tài)機(jī)制在此是否會(huì)發(fā)生作用。或許你會(huì)說,試試不就知道啦J */
};
class GrandChildCls : public ChildCls
{
public:
 void f();
};

12.接口
 C#中的接口和Java中的接口差不多,但是有更大的彈性。類可以隨意地顯式實(shí)現(xiàn)某個(gè)接口:
public interface ITeller
{
void Next ();
}
public interface IIterator
{
void Next ();
}
public class Clark : ITeller, IIterator
{
void ITeller.Next () {}
void IIterator.Next () {}
}
這給實(shí)現(xiàn)接口的類帶來了兩個(gè)好處。其一,一個(gè)類可以實(shí)現(xiàn)若干接口而不必?fù)?dān)心命名沖突問題。其二,如果某方法對一般用戶來說沒有用的話,類能夠隱藏該方法。顯式實(shí)現(xiàn)的方法的調(diào)用,需把類【譯注:應(yīng)該是對象】造型轉(zhuǎn)換為接口:
Clark clark = new Clark();
((ITeller)clark).Next();
13.版本處理
 解決版本問題已成為.NET框架一個(gè)主要考慮。這些考慮的大多數(shù)都體現(xiàn)于組合體中。在C#中,可在同一個(gè)進(jìn)程里運(yùn)行同一個(gè)組合體的不同版本的能力是令人印象深刻的。
 當(dāng)代碼的新版本(尤其是.NET庫)被創(chuàng)建時(shí),C#可以防止軟件失敗。C#語言參考里詳細(xì)地描述了該問題。我用一個(gè)例子簡明扼要地講解如下:
 在Java中,假定我們部署一個(gè)稱為D的類,它是從一個(gè)通過VM發(fā)布的叫B的類派生下來的。類D有一個(gè)叫foo的方法,而它在B發(fā)布時(shí),B還沒有這個(gè)方法。后來,對類B做了個(gè)升級,現(xiàn)在B包括了一個(gè)叫foo的方法,新的VM現(xiàn)在安裝在使用類D的機(jī)器上了。現(xiàn)在,使用D的軟件可能會(huì)發(fā)生故障了,因?yàn)轭怋的新實(shí)現(xiàn)可能會(huì)導(dǎo)致一個(gè)對D的虛函數(shù)調(diào)用,這就執(zhí)行了一個(gè)類B始料未及的動(dòng)作。【譯注:因Java中方法缺省是虛的】在C#中,類D的foo方法應(yīng)該聲明為不用override修飾符的(這個(gè)真正表達(dá)了程序員的意愿),因此,運(yùn)行時(shí)知道讓類D的foo方法隱藏類B的foo方法,而不是重載它。
 引用C#參考手冊的一句有意思的話“C#處理版本問題是通過需要開發(fā)人員明確他們的意圖來實(shí)現(xiàn)的”。盡管使用override是一個(gè)表達(dá)意圖的辦法,但編譯器也能自動(dòng)生成—通過在編譯時(shí)檢查方法是否在執(zhí)行(而不是聲明)一個(gè)重載。這就意味著,你仍然能夠擁有象Java一樣的語言(Java不用virtual和override關(guān)鍵字),并且仍然能夠正確處理版本問題。
 參見字段修飾符部分。
14.參數(shù)修飾符
(1)ref參數(shù)修飾符
 C#(和Java相比)可以讓你按引用傳遞參數(shù)。描述這一點(diǎn)的最明顯的例子是通用交換方法。不象C++,不但是聲明時(shí),調(diào)用時(shí)也要加上ref指示符:【譯注:不要誤會(huì)這句話,C++中當(dāng)然是沒有ref關(guān)鍵字】
public class Test
{
public static void Main ()
{
int a = 1;
int b = 2;
swap (ref a, ref b);
}
public static void swap (ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
}
(2)out參數(shù)修飾符
out關(guān)鍵字是對ref參數(shù)修飾符的自然補(bǔ)充。Ref修飾符要求參數(shù)在傳入方法之前必須被賦值。而out修飾符則明確當(dāng)方法返回時(shí)需顯式給參數(shù)賦值,。
(3)params參數(shù)修飾符
 params修飾符可被加在方法的最后的參數(shù)上,方法將接受任意數(shù)量的指定類型的參數(shù)【譯注:在一個(gè)方法聲明中,只允許一個(gè)params性質(zhì)的參數(shù)】。例如:
public class Test
{
public static void Main ()
{
Console.WriteLine (add (1, 2, 3, 4).ToString());
}
public static int add (params int[] array)
{
 int sum = 0;
 foreach (int i in array)
 sum += i;
 return sum;
}
}
【作者注:學(xué)習(xí)Java時(shí)一個(gè)非常令人詫異的事是發(fā)現(xiàn)Java不能按引用傳遞參數(shù),盡管不久以后,你很少會(huì)再想要這個(gè)功能,并且寫代碼時(shí)也不需要它了。當(dāng)我第一次閱讀C#規(guī)范的時(shí)候,我常想,“他們干嗎把加上這個(gè)功能,沒有它我也能寫代碼”。經(jīng)過反省以后,我意識到這其實(shí)并不是說明某些功能是否有用的問題,更多是說明了沒有它你就另需別的

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 在线观看成年人免费视频 | 天天色国产 | 99热久久这里只有精品23 | 免费人成视网站在线不卡 | 国产精品久久久久久久网站 | 97se色综合一区二区二区 | 天天做天天爱夜夜爽毛片毛片 | 日韩精品一区二区三区中文 | 亚洲欧美日韩中文字幕在线一区 | 最新91 | 久久毛片视频 | 日韩欧美在线观看视频 | 在线观看国产片 | 久青草中文字幕精品视频 | 欧美刺激午夜性久久久久久久 | 日本高清免费在线视频 | 在线观看国产精品日本不卡网 | 日本www色 | 天天色影院 | 国产91视频网 | 天天欲色成人综合网站 | 久久亚洲精品国产亚洲老地址 | 青娱乐伊人 | 日本一级毛片在线观看 | 在线91| 伊人色综合久久大香 | 牛牛视频在线观看 | 亚洲国产成人精品不卡青青草原 | 在线播放一区二区三区 | 中文字幕热久久久久久久 | 日韩毛片免费看 | 色综合天天综合 | 国产一区二区三区四区蜜芽 | 日韩欧美高清视频 | www视频在线免费观看 | 最近高清中文在线国语视频 | 国产精品酒店视频免费看 | 偷自拍| 日韩免费视频播播 | 欧美亚洲国产日韩一区二区三区 | 91人碰|