wednesday, october 13, 2004
浮點(diǎn)數(shù)的比較運(yùn)算
對(duì)浮點(diǎn)數(shù)進(jìn)行比較,必須先舍入為相同精度再進(jìn)行,因其的不精確性。
在需要測(cè)試某個(gè)float值或double值是否為無(wú)窮大或nan時(shí),不能直接用single或double結(jié)構(gòu)中的positiveinfinity、negativeinfinity或nan字段進(jìn)行比較;應(yīng)選用isinfinity等方法來(lái)完成,因其有二義。
建議最好不要用“==”操作符去比較兩個(gè)布爾值,因?yàn)椴恍⌒纳俅蛞粋€(gè)等號(hào),會(huì)致命的??梢允褂卯惢虿僮鞣癪”將更穩(wěn)妥。異或操作等價(jià)于“!=”操作符,所以有不少人把“^”稱為邏輯“不等于”操作符。只要用“^”操作符對(duì)“!=”操作的結(jié)果再進(jìn)行一次邏輯非處理,就能得到與“==”操作符同樣的效果,如:
bwearecompatible = byoulikemahler == bilikemahler
bwearecompatible = !(byoulikemahler ^ bilikemahler)
局部變量只在對(duì)它做出了聲明的那個(gè){語(yǔ)句塊}里才是可見的。這個(gè)語(yǔ)句塊有多大,求證中....
c#沒有“else語(yǔ)句”之類的東東,c#中的if語(yǔ)句由一個(gè)if部分和一個(gè)可選的else部分構(gòu)成。c#也沒有“else if語(yǔ)句”,是兩條if組合在一起而矣。
條件操作符
條件與(&&)與條件或(||)
bexpression1 && bexpression2//如果bexpression1被求值為false,bexpression2將不會(huì)被求值
bexpression1 || bexpression2//如果bexpression1被求值為true,bexpression2將不會(huì)被求值
古怪“條件表達(dá)式”(?:),唯一三目操作符。
一、c#的異常處理所用到關(guān)鍵字
try 用于檢查發(fā)生的異常,并幫助發(fā)送任何可能的異常。
catch 以控制權(quán)更大的方式處理錯(cuò)誤,可以有多個(gè)catch子句。
finally 無(wú)論是否引發(fā)了異常,finally的代碼塊都將被執(zhí)行。
throw 用于引發(fā)異常,可引發(fā)預(yù)定義異常和自定義異常。
二、c#異常處理的格式 以下是引用片段:
try
{
程序代碼塊;
}
catch(exception e)
{
異常處理代碼塊;
}
finally
{
無(wú)論是否發(fā)生異常,均要執(zhí)行的代碼塊;
}
有效的調(diào)試技巧
沒有漏網(wǎng)的魚 "this statement should never be executed."
for語(yǔ)句以保留字"for"開始,后面跟著一對(duì)圓括號(hào),括號(hào)里有三個(gè)用分號(hào)隔開的表達(dá)式。注意,這是分號(hào)在c#中惟一不被當(dāng)作一個(gè)語(yǔ)句分隔符來(lái)對(duì)待的地方!這三個(gè)表達(dá)式分別叫作for循環(huán)的“初始化表達(dá)式”、“循環(huán)條件表達(dá)式”和“步長(zhǎng)表達(dá)式”。
friday, october 15, 2004
算法“sieve of eratosthences”(eratosthences之篩)是一種用來(lái)生成素?cái)?shù)的算法。素?cái)?shù)是只能被1和它本身整除的整數(shù)。2是第一個(gè)素?cái)?shù),也是素?cái)?shù)中惟一的一個(gè)偶數(shù)。
cpu耗時(shí)比較:方法調(diào)用 > 乘除運(yùn)算 > 加減運(yùn)算
switch語(yǔ)句
在java中,switch語(yǔ)句只能處理整數(shù)。但c#中的switch語(yǔ)句不同,它還能夠處理字符變量。
switch (args[0]) {
case "老板":
console.writeline("早上好!我們隨時(shí)準(zhǔn)備為您效勞!");
break;
case "雇員":
console.writeline("早上好!你可以開始工作了!");
break;
default:
console.writeline("早上好!祝你好運(yùn)!");
break;
}
與java中的switch不同,c#的switch語(yǔ)句要求每一個(gè)case塊或者在塊的末尾提供一個(gè)break語(yǔ)句,或者用goto轉(zhuǎn)到switch內(nèi)的其他case標(biāo)簽。這就是所謂c#的“不允許留下swicth分支漏斗”的規(guī)定,不過你可以讓一個(gè)switch分支有多個(gè)switch標(biāo)號(hào)。如:
....
case "*"://多種乘法運(yùn)算符
case "x"://
case "x"://
dresult = dnum1 * dnum2
break;
....
編寫c#程序的“基本工具”:
聲明語(yǔ)句;
賦值語(yǔ)句;
選擇語(yǔ)句(if, switch);//它們使程序能夠根據(jù)一個(gè)比較操作或者其他布爾操作的結(jié)果有選擇地改變執(zhí)行路線
循環(huán)語(yǔ)句(while, do, for, foreach);//它們使程序能夠反復(fù)多次地執(zhí)行同一組語(yǔ)句。
跳轉(zhuǎn)語(yǔ)句(return, break, continue, throw, goto);//它們使程序能夠從一個(gè)地方跳轉(zhuǎn)到另一個(gè)地方去繼續(xù)執(zhí)行。
c#沒有>>>移位操作符
c#支持uint和ulong之類的無(wú)符號(hào)變量類型。因此,在c#中,右移操作符(即“>>”)對(duì)于無(wú)符號(hào)變量類型和帶符號(hào)變量類型(比如int和long)的處理方式不同。右移uint和ulong丟棄低位并把空出的高位設(shè)置為零;但對(duì)于int和long類型的變量,“>>”操作符丟棄低位,同時(shí),只有當(dāng)變量值是正數(shù)時(shí),“>>”才把空出的高位設(shè)置成零;如果“>>”操作的是一個(gè)負(fù)數(shù),空出的高位被設(shè)置成為1。
java中不存在無(wú)符號(hào)的變量類型。因此,我們用“>>>”操作符在右移時(shí)引入負(fù)號(hào)位;否則,使用“>>”操作符。
枚舉器
枚舉器即enum類型(enumerator,或稱為計(jì)數(shù)器),它是一個(gè)相關(guān)常量的集合。精確地說,enum類型聲明為一組相關(guān)的符號(hào)常量定義了一個(gè)類型名字。例如,你可以創(chuàng)建一個(gè)名為fruit(水果)的枚舉器,把它作為一個(gè)變量值的類型使用,從而把變量可能的取值范圍限制為枚舉器中出現(xiàn)的值。
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;
}
}
}
sunday, october 17, 2004
c#方法調(diào)用傳遞的參數(shù)分四類:
默認(rèn)的值參數(shù)(value parameter); //傳遞復(fù)制品
引用參數(shù)(reference parameter),關(guān)鍵字"ref";//傳遞引用指針
輸出參數(shù)(output parameter),關(guān)鍵字"out"。//方法返回一個(gè)以上的返回值時(shí)使用
數(shù)組參數(shù)(array parameter),關(guān)鍵字"params"
引用參數(shù)與輸出參數(shù)的區(qū)別:
“引用參數(shù)”與“輸出參數(shù)”非常相似。out修飾符ref修飾符有很相似的地方:傳址。事實(shí)上保留字“ref”和“out”本身在中間語(yǔ)言里的實(shí)現(xiàn)是一模一樣的。但c#中的ref參數(shù)與out參數(shù)還是有區(qū)別的:
ref參數(shù)必須在進(jìn)入方法之前得到賦值;
out參數(shù)則必須在離開方法之前得到賦值。需要記住輸出參數(shù)與通常的函數(shù)返回值有一定的區(qū)別:函數(shù)返回值往往存在堆棧里,在返回時(shí)彈出;而輸出參數(shù)需要用戶預(yù)先制定存儲(chǔ)位置,也就是用戶需要提前聲明變量--當(dāng)然也可以初始化。
using system;
class test //拆分姓名
{
static void resolutename(string fullname,out string firstname,out string lastname)
{
string[] strarray=fullname.split(new char[]{' '});
firstname=strarray[0];
lastname=strarray[1];
}
public static void main()
{
//string myname="cornfield lee";
console.writeline("enter your name:");
string myname = console.readline();
string myfirstname,mylastname;
resolutename(myname,out myfirstname,out mylastname);
console.writeline("my first name: {0}, my last name: {1}",
myfirstname, mylastname);
}
}
數(shù)組參數(shù)(關(guān)鍵字"params")
using system;
class test //合計(jì)所有整數(shù)值
{
static int sum(params int[] args)
{
int s=0;
foreach(int n in args)
{
s+=n;
}
return s;
}
static void main()
{
int[] var=new int[]{1,2,3,4,5};
console.writeline("the sum:"+sum(var));//傳數(shù)組變量
console.writeline("the sum:"+sum(10,20,30,40,50));//傳能夠隱式轉(zhuǎn)化為數(shù)組的參數(shù)
}
}
注意以下兩個(gè)規(guī)定:
數(shù)組參數(shù)只能是一維的;
如果有多個(gè)輸入?yún)?shù),就只允許一個(gè)輸入?yún)?shù)是params參數(shù),而且它必須是參數(shù)表中的最后一個(gè)。
tuesday, october 19, 2004
數(shù)據(jù)的封裝-對(duì)象
從本質(zhì)上講,對(duì)象就是數(shù)據(jù)。隨著程序設(shè)計(jì)語(yǔ)言的發(fā)展,當(dāng)人們開始把不同的數(shù)據(jù)組合在一起并當(dāng)作一個(gè)整體事物來(lái)對(duì)待時(shí),“對(duì)象”出世了!(拿日期對(duì)象作理解)
在聲明變量和常數(shù)時(shí),你的程序其實(shí)就是在創(chuàng)建對(duì)象,數(shù)值常數(shù)和字符串都是對(duì)象。不過,有你的程序真正執(zhí)行有關(guān)語(yǔ)句之前,對(duì)象是不會(huì)“出生的”。
日期對(duì)象:日期是由三個(gè)分立的數(shù)型變量組合而成的有機(jī)整體,這樣會(huì)大大簡(jiǎn)化對(duì)日期數(shù)據(jù)的處理。
new操作符將為新實(shí)例分配內(nèi)存并把它的的各個(gè)字段全部初始化為0;堆內(nèi)永遠(yuǎn)是被初始化為的0的(就是堆棧可是值0或空指針null)。
date[] adate = new date[5];
如果date是一個(gè)結(jié)構(gòu):這條語(yǔ)句將從堆里為這個(gè)結(jié)構(gòu)的5個(gè)實(shí)例(無(wú)需new初始化了,叫實(shí)例了嘛)分配內(nèi)存并把各元素的所有字段全部初始化為0;
如果是一個(gè)類,這條語(yǔ)句將只為這個(gè)數(shù)組本身分配內(nèi)存(上面也會(huì)為數(shù)組本身分本內(nèi)存,不過還為結(jié)構(gòu)實(shí)例分配)。這個(gè)數(shù)組的各個(gè)元素將是null。因?yàn)檫@個(gè)數(shù)組的各個(gè)元素都是一個(gè)引用(指針)。在使用這個(gè)數(shù)組的元素前,必須先用一個(gè)new構(gòu)造實(shí)例(包括分配內(nèi)存和初始化):
adate[3] = new date();
c#數(shù)組是一個(gè)引用類型,數(shù)組中的各個(gè)元素將存儲(chǔ)在堆里。如 int[] ai = new int[12];//使用new關(guān)鍵字在heap分配內(nèi)存
除了數(shù)組,c#還有以下引用類型:
堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對(duì)象。所以結(jié)構(gòu)處理作為基類型對(duì)待的小對(duì)象,而類處理某個(gè)商業(yè)邏輯
雖然結(jié)構(gòu)的初始化也使用了new 操作符,可是結(jié)構(gòu)對(duì)象依然分配在堆棧上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態(tài),且對(duì)象不可用
如何選擇結(jié)構(gòu)還是類
討論了結(jié)構(gòu)與類的相同之處和差別之后,下面討論如何選擇使用結(jié)構(gòu)還是類:
堆棧的空間有限,對(duì)于大量的邏輯的對(duì)象,創(chuàng)建類要比創(chuàng)建結(jié)構(gòu)好一些
結(jié)構(gòu)表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象,例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低。
在表現(xiàn)抽象和多級(jí)別的對(duì)象層次時(shí),類是最好的選擇
大多數(shù)情況下該類型只是一些數(shù)據(jù)時(shí),結(jié)構(gòu)時(shí)最佳的選擇
面向過程到面向?qū)ο笕阶撸?
封裝對(duì)象簡(jiǎn)化輸入?yún)?shù)列表:
static int dayofyear(int iyear, int imonth, int iday){....}//三個(gè)整型輸入?yún)?shù)
static int dayofyear(date ddate){....}//date就好像是一個(gè)已預(yù)先定義好的簡(jiǎn)單類型。
封裝與對(duì)象有關(guān)的方法到類(或結(jié)構(gòu))內(nèi)部中去,成為類(或結(jié)構(gòu))的行為,進(jìn)一步共享代碼:
區(qū)分類(或結(jié)構(gòu))方法和字段的靜態(tài)性和實(shí)例性,進(jìn)一步簡(jiǎn)化使用對(duì)象的代碼。
.net framewrok里的每一個(gè)類和每一個(gè)結(jié)構(gòu)tostring方法,自已定義的類和結(jié)構(gòu)也不例外,因?yàn)閏#里所有類和結(jié)構(gòu)都繼承自同一個(gè)祖先——system.object類。雖然結(jié)構(gòu)不支持繼承,但是所有的結(jié)構(gòu)都是直接或間接從system.valuetype類繼承而來(lái)的。
若一個(gè)實(shí)例方法的聲明中含有 virtual 修飾符,則稱該方法為虛擬方法。若其中沒有 virtual 修飾符,則稱該方法為非虛擬方法。
非虛擬方法的實(shí)現(xiàn)是不會(huì)變的:無(wú)論是在聲明它的類的實(shí)例上調(diào)用該方法還是在派生類的實(shí)例上調(diào)用,實(shí)現(xiàn)都是相同的。與此相反,一個(gè)虛擬方法的實(shí)現(xiàn)可以由派生類取代。
關(guān)鍵字"virtual"和"override"是密切相關(guān)的:如果a類繼承b類,就可以在a類里用一個(gè)override(重寫)方法覆蓋掉b類里的同名的virtual方法。
不使用"override"關(guān)鍵字也能覆蓋一個(gè)方法,但這種做法只有新、老方法的簽名和訪問性完全一致的情況下才能達(dá)到目的
wednesday, october 20, 2004
類的字段初始化方法:
在聲明語(yǔ)句里直接初始化:
class date{
public int iyear = 2004;
public int imonth = 10;
public int iday = 20;
.......
}
使用構(gòu)造器:
class date{
public int iyear, imonth, imonth;
public date(){//無(wú)參數(shù)構(gòu)造器
iyear = 1;
imonth = 1;
iday = 1;
}
.......
}
為了加快那些基于結(jié)構(gòu)的數(shù)組的創(chuàng)建速度,結(jié)構(gòu)均不支持以上兩種初始化結(jié)構(gòu)的方法。
c#的結(jié)構(gòu)是一個(gè)關(guān)系重大的語(yǔ)言功能。和類一樣,結(jié)構(gòu)也可以包含其他類型。由于結(jié)構(gòu)在內(nèi)部是值類型的,所以結(jié)構(gòu)有時(shí)也被稱為類的輕型版本。同時(shí),結(jié)構(gòu)不承擔(dān)引用對(duì)象所帶來(lái)的開銷,除非在對(duì)其裝箱時(shí)例外。
c#的結(jié)構(gòu)結(jié)論:
結(jié)構(gòu)的定義是封閉的(不能作為基類使用);
結(jié)構(gòu)隱式地派生自system.valuetype,而system.valuetype是所有值類型的超類型(終極基類)。
結(jié)構(gòu)沒有默認(rèn)的構(gòu)造器。
阻止創(chuàng)建類實(shí)例的方法:一個(gè)私有的(private)空白無(wú)參數(shù)構(gòu)造器,如:class clsa{...private clsa(){}...}
實(shí)際上如果我們能夠深刻地把握類的構(gòu)造器的唯一目的就是保證類內(nèi)的成員變量能夠得到正確的初始化,我們對(duì)各種c#中形形色色的構(gòu)造器便有會(huì)心的理解--它沒有理由不這樣!
⒈﹜ ┣━┒ ; `.┣─┒` ..wǒ
個(gè)ボ ┟━┃┍╄┓┟━│ ╃━
人 ┝─┃┣╈┤┣━┃;/ ╈
┗━┘┗┸┛└━┛/┃┻
相等性:
當(dāng)你自行創(chuàng)建一個(gè)類或結(jié)構(gòu)時(shí),一定要對(duì)相等性概念多做些思考。
要想成為一名合格的程序員,不僅要知道類對(duì)象和結(jié)構(gòu)對(duì)象在相等性、賦值操作、方法調(diào)用等幾個(gè)方面有何不同,還要了解new操作符對(duì)類對(duì)象和結(jié)構(gòu)對(duì)象的處理有何不同。
要想創(chuàng)建出某個(gè)類的一個(gè)實(shí)例,就必須使用一個(gè)new操作符,new操作符將進(jìn)行幾項(xiàng)非常重要的處理:
從堆里為新對(duì)象分配內(nèi)存;
有選擇地調(diào)用那個(gè)類的某一個(gè)構(gòu)造器。
創(chuàng)建出某個(gè)結(jié)構(gòu)的一個(gè)實(shí)例,也使用一個(gè)new操作符,new操作符將調(diào)用結(jié)構(gòu)的惟一的無(wú)參數(shù)構(gòu)造器(不能重寫),無(wú)參數(shù)構(gòu)造器只是把所有的字段初始化0或null而已,其他什么都不做。不允許字段非零和上面結(jié)構(gòu)創(chuàng)建速度有關(guān)的。
reference types versus value types
以下是引用片段:
// reference type (because of ’class’)
class ref { public int x, y, cx, cy; }
// value type (because of ’struct’)
struct val { public int x, y, cx, cy; }
static void somemethod {
ref r1 = new ref(); // allocated in heap
val v1; // allocated on stack (new optional)
r1.x = 10; // pointer dereference
v1.x = 10; // changed on stack
rectref r2 = r1; // copies pointer only
rectval v2 = v1; // allocate on stack & copies members
r1.x = 20; // changes r1 and r2
v1.x = 20; // changes v1, not v2
}
sunday, october 24, 2004
域的存取限制集中體現(xiàn)了面向?qū)ο缶幊痰姆庋b原則。
只讀(readonly)域不能進(jìn)行寫操作,不變常量(const)不能被修改,這兩者到底有什么區(qū)別呢?
只讀域只能在初始化--聲明初始化或構(gòu)造器初始化--的過程中賦值,其他地方不能進(jìn)行對(duì)只讀域的賦值操作,否則編譯器會(huì)報(bào)錯(cuò)。只讀域可以是實(shí)例域也可以是靜態(tài)域。只讀域的類型可以是c#語(yǔ)言的任何類型。
但const修飾的常量必須在聲明的同時(shí)賦值,而且要求編譯器能夠在編譯時(shí)期計(jì)算出這個(gè)確定的值。const修飾的常量為靜態(tài)變量,不能夠?yàn)閷?duì)象所獲取。const修飾的值的類型也有限制,它只能為下列類型之一(或能夠轉(zhuǎn)換為下列類型的):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum類型, 或引用類型。能夠聲明為const的引用類型只能為string或值為null的其他引用類型。
實(shí)際上,如果我們能夠理解const修飾的常量是在編譯時(shí)便被計(jì)算出確定的值,并代換到引用該常量的每一個(gè)地方,而readonly時(shí)在運(yùn)行時(shí)才確定的量--只是在初始化后我們不希望它的值再改變,我們便能理解c#設(shè)計(jì)者們的良苦用心,我們才能徹底把握const和readonly的行為!
c#不提倡將域的保護(hù)級(jí)別設(shè)為public而使用戶在類外任意操作--那樣太不oo,或者具體點(diǎn)說太不安全!對(duì)所有有必要在類外可見的域,c#推薦采用屬性來(lái)表達(dá)。屬性不表示存儲(chǔ)位置,這是屬性和域的根本性的區(qū)別。
繼承:
一個(gè)現(xiàn)有的類(基類)派生出一個(gè)新類(子類)時(shí),子類將自動(dòng)獲得所有被聲明在基類的非private方法、屬性和字段(注意基類的構(gòu)造器是不會(huì)被繼承的。)。子類可以通過增加或者替換它繼承到的各種方法、屬性和字段的方式對(duì)基類的功能進(jìn)行擴(kuò)展。
繼承能力是類和結(jié)構(gòu)的重要區(qū)別之一。結(jié)構(gòu)不支持繼承機(jī)制。
學(xué)海無(wú)涯,面向?qū)ο蟮某绦蛟O(shè)計(jì)既是一門科學(xué),也是一門藝術(shù),如果這本書能讓大家領(lǐng)略到它的一些奧妙,作者知足了!!
繼承與預(yù)構(gòu)造器(constructor initializer)
每一個(gè)構(gòu)造器都會(huì)用一個(gè)預(yù)構(gòu)造器
子類不能繼承基類的構(gòu)造器但是可以“拿來(lái)用”,用關(guān)鍵字“base”指定父類和“this”指定本類中的構(gòu)造器作為本構(gòu)造器的預(yù)構(gòu)造器。
在沒有指定時(shí),父類的無(wú)參數(shù)構(gòu)構(gòu)造器為缺省的預(yù)構(gòu)造器,即:“base()”
訪問限定符理解:
很多新手認(rèn)為代碼共享就是最大限度的開放自己的代碼,總是不假思索把所有東西都聲明為“public”,其實(shí)類里面的public成員應(yīng)該越少越好,因?yàn)榭梢越档驼{(diào)試難道,還遵循“盡量掩藏?cái)?shù)據(jù)。使類成為一個(gè)代碼黑箱”的原則。
monday, october 25, 2004
one of the more powerful concepts in object-oriented programming is polymorphism. the roots of this word, "poly-" and "-morph" mean, when put together, "many forms."
polymorphism(破利摩飛神):“poly-”表示多之意,“-morph”,形態(tài)形狀
多態(tài)實(shí)例:
using system ;
public class drawingbase{
public virtual void draw(){//基類虛方法
console.writeline("i'm just a generic drawing object.");
}
}
public class line : drawingbase{
public override void draw( ){//子類重寫虛方法1
console.writeline("i'm a line.");
}
}
public class circle : drawingbase{
public override void draw( ){//子類重寫虛方法2
console.writeline("i'm a circle.");
}
}
public class square : drawingbase{
public override void draw( ){//子類重寫虛方法3
console.writeline("i'm a square.");
}
}
public class drawdemo{
public static int main(string[] args){
drawingbase [] dobj = new drawingbase [4];//創(chuàng)建基類類型數(shù)組
dobj[0] = new line( );//賦值類型向上轉(zhuǎn)換
dobj[1] = new circle( );//聲明(編譯時(shí))為基類類型,實(shí)際類型(運(yùn)行時(shí))為子類類型
dobj[2] = new square( );
dobj[3] = new drawingbase( );
foreach (drawingbase drawobj in dobj)
drawobj.draw( );//運(yùn)行時(shí)“后綁定”各個(gè)draw版本
return 0;
}
}
as 運(yùn)算符
用于執(zhí)行可兼容類型之間的轉(zhuǎn)換。as 運(yùn)算符用在以下形式的表達(dá)式中:expression as type
as 運(yùn)算符類似于類型轉(zhuǎn)換,所不同的是,當(dāng)轉(zhuǎn)換失敗時(shí),as 運(yùn)算符將產(chǎn)生空,而不是引發(fā)異常。
請(qǐng)注意,as 運(yùn)算符只執(zhí)行引用轉(zhuǎn)換和裝箱轉(zhuǎn)換。as 運(yùn)算符無(wú)法執(zhí)行其他轉(zhuǎn)換。
is 運(yùn)算符用于檢查對(duì)象的運(yùn)行時(shí)類型是否與給定類型兼容。
gettype()方法與操作符typeof()和system.type類
type t = instance.gettype();//一個(gè)實(shí)例方法,返回一個(gè)type對(duì)象
type t = typeof(class);//一個(gè)操作符,操作數(shù)為一種類型非某一實(shí)例,也是返回一個(gè)type對(duì)象
相等性比較:bool b = instance.gettype() == typeof(class);
所謂“實(shí)現(xiàn)一個(gè)接口”指的是把該接口所聲 明的方法都在某個(gè)類里實(shí)現(xiàn)出來(lái)。
接口本質(zhì)上是類需要如何響應(yīng)的定義。接口描述類需要實(shí)現(xiàn)的方法、屬性和事件,以及每個(gè)成員需要接收和返回的參數(shù)類型,但將這些成員的特定實(shí)現(xiàn)留給實(shí)現(xiàn)類去完成。
派生類可以重寫(override)基類里的虛(virtual)方法和屬性, 也可“隱藏”(new關(guān)鍵字)基類里的非虛成員。
操作符重載:()
operators are defined for the built-in types, but that's not all. you can add operators to your own types, allowing them to be used much like the operators with the built-in c# types.
requirement:you create a matrix type and then do a mathematical operation with them.
solution:
implement an add(), dotproduct(), and other methods to get the job done.
matrix result = mat1.add(mat2); // instanceormatrix result = matrix.add(mat1, mat2); // staticor event worsematrix result = mat1.dotproduct(mat2).dotproduct(mat3); // and so on...
much easier to have a + operator for the add operation and a * operator for the dot product operation.
matrix result = mat1 + mat2;or matrix result = mat1 * mat2;or even bettermatrix result = mat1 * mat2 * mat3 * mat4;