java程序员学C#基本语法两个小时搞定(对比学习)
對(duì)于學(xué)習(xí)一門(mén)新的語(yǔ)言,關(guān)鍵是學(xué)習(xí)新語(yǔ)言和以前掌握的語(yǔ)言的區(qū)別,但是也不要讓以前語(yǔ)言的東西,固定了自己的思維模式,多看一下新的語(yǔ)言的編程思想。
1.引包
??using System;java用import
2.構(gòu)造函數(shù)和java語(yǔ)法相同
3.析構(gòu)函數(shù)
??變量和類的對(duì)象都有生命周期,生命周期結(jié)束,這些變量和對(duì)象就要被撤銷。
??類的對(duì)象被撤銷時(shí),將自動(dòng)調(diào)用析構(gòu)函數(shù)。一些善后工作可放在析構(gòu)函數(shù)中完成。
??析構(gòu)函數(shù)的名字為~類名,無(wú)返回類型,也無(wú)參數(shù)。Person類的析構(gòu)函數(shù)為~ Person()。
??C#中類析構(gòu)函數(shù)不能顯示地被調(diào)用,它是被垃圾收集器撤銷不被使用的對(duì)象時(shí)自動(dòng)調(diào)用的。
4.C#數(shù)據(jù)類型
??從大的方面來(lái)分,C#語(yǔ)言的數(shù)據(jù)類型可以分為三種:值類型,引用類型,指針類型,指針類型僅用于非安全代碼中。
??C#運(yùn)行在CLR中,其中有垃圾自動(dòng)回收器,和java類似
??4.1值類型
????簡(jiǎn)單類型:
??????--數(shù)值類型:整數(shù)類型、字符類型(char)、浮點(diǎn)數(shù)類型和十進(jìn)制類型(decimal)
??????--布爾類型(bool)
??????(1)簡(jiǎn)單類型也是結(jié)構(gòu)類型,因此有構(gòu)造函數(shù)、數(shù)據(jù)成員、方法、屬性等;
?????????因此下列語(yǔ)句int i=int.MaxValue;string s=i.ToString()是正確的;
?????????即使一個(gè)常量,C#也會(huì)生成結(jié)構(gòu)類型的實(shí)例,因此也可以使用結(jié)構(gòu)類型的方法,
?????????例如:string s=13.ToString()是正確的。
??????(2)
????????保留字 | System命名空間中的名字 | 字節(jié)數(shù) ?| ?取值范圍
????????sbyte ????System.Sbyte1 ?????????????1 ???????-128~127
byte ?????System.Byte ???????????????1 ????????0~255
????????short ????System.Int16 ??????????????2 ????-32768~32767
????????ushort ???System.UInt16 ?????????????2 ??????0~65535
??int ??????System.Int32 ??????????????4 ?????-2147483648~2147483647
uint ?????System.UInt32 ?????????????4 ?????0~4292967295
????????long ?????System.Int64 ??????????????8 ?????-9223372036854775808~9223372036854775808
ulong ????System.UInt64 ?????????????8 ?????0~18446744073709551615
????????char ?????System.Char ???????????????2 ?????0~65535
float ????System.Single ?????????????4 ?????3.4E-38~3.4E+38
double ???System.Double ?????????????8 ?????1.7E-308~1.7E+308
??bool ?????System.Boolean ???????????????????(true,false)
decimal ??System.Decimal ????????????16 ????±1.0 × 10?28 to ±7.9 × 1028
????????
????????(1)decimal類型用來(lái)表示高精度的浮點(diǎn)數(shù),可以用到金融相關(guān)領(lǐng)域。
????????(2)浮點(diǎn)數(shù)都有精度損失問(wèn)題,操作時(shí)注意下即可。
(3)字符類型采用Unicode字符集,一個(gè)Unicode標(biāo)準(zhǔn)字符長(zhǎng)度為16位。
????????(4)整數(shù)類型不能隱式被轉(zhuǎn)換為字符類型(char),和java不同,必須強(qiáng)轉(zhuǎn)或者用Unicode表示
????????(5)布爾類型有兩個(gè)值:false,true。不能認(rèn)為整數(shù)0是false,其它值是true。
??????????bool x=1是錯(cuò)誤的,不存在這種寫(xiě)法,只能寫(xiě)成x=true 或x=false
????????
???????
????結(jié)構(gòu)類型(Struct types)
??????(1)結(jié)構(gòu)類型和類一樣,可以聲明構(gòu)造函數(shù)、數(shù)據(jù)成員、方法、屬性等。
??????(2)結(jié)構(gòu)和類的最根本的區(qū)別是結(jié)構(gòu)是值類型,類是引用類型。
??????(3)和類不同,結(jié)構(gòu)不能從另外一個(gè)結(jié)構(gòu)或者類派生,本身也不能被繼承,因此不能定義抽象結(jié)構(gòu),
???????????結(jié)構(gòu)成員也不能被訪問(wèn)權(quán)限控制字protected修飾,也不能用virtual和abstract修飾結(jié)構(gòu)方法。
??????(4)在結(jié)構(gòu)中不能定義析構(gòu)函數(shù)。
??????(5)雖然結(jié)構(gòu)不能從類和結(jié)構(gòu)派生,可是結(jié)構(gòu)能夠繼承接口,結(jié)構(gòu)繼承接口的方法和類繼承接口的方法基本一致。
???????例子:
??????????using System;
?//結(jié)構(gòu)定義
??????????struct point{
public int x,y;//結(jié)構(gòu)中也可以聲明構(gòu)造函數(shù)和方法,變量不能賦初值
??????????}
???class Test{
??????static void Main(){
????????????????point P1;
????????????????P1.x=166;
????????????????P1.y=111;
????????????????point P2;
????????????????P2=P1;//值傳遞,使P2.x=166,P2.y=111
????????????????point P3 = new point();//用new生成結(jié)構(gòu)變量P3,P3仍為值類型變量
????????????????//用new生成結(jié)構(gòu)變量P3僅表示調(diào)用默認(rèn)構(gòu)造函數(shù),使x=y==0。
?????????????}
??????????}
????枚舉類型(Enumeration types)
??????C#枚舉類型使用方法和C、C++中的枚舉類型基本一致,和java的區(qū)別較大
??????(1)定義枚舉
//設(shè)置初值,從1開(kāi)始
?????????enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
//位設(shè)置初值,從0開(kāi)始?
?????????enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
??
??????(2)使用枚舉
?????????Days day=Days.Tue;
?????????int x=(int)Days.Tue;
?????(3)C、C++中不同,C#枚舉元素類型可以是byte、sbyte、short、ushort、int、uint、long和ulong類型,但不能是char類型
????????enum Days:byte{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//元素為字節(jié)類型
?????(4)學(xué)習(xí)鏈接http://www.cnblogs.com/liyingyi/archive/2005/12/28/306772.aspx
??????
???變量的初始值:一般簡(jiǎn)單類型的初始值是0,布爾型的是false,引用類型的是null。
????對(duì)于復(fù)雜結(jié)構(gòu)類型,其中的每個(gè)數(shù)據(jù)成員都按此種方法賦值,顯得過(guò)于麻煩。
????由于數(shù)值類型都是結(jié)構(gòu)類型,可用new語(yǔ)句調(diào)用其構(gòu)造函數(shù)初始化數(shù)值類型變量,
????例如:int j=new int()。
????請(qǐng)注意,用new語(yǔ)句并不是把int變量變?yōu)橐米兞?#xff0c;j仍是值類型變量,
????這里new僅僅是調(diào)用其構(gòu)造函數(shù)。所有的數(shù)值類型都有默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),其功能就是為該數(shù)值類型賦初值為默認(rèn)值。
????對(duì)于自定義結(jié)構(gòu)類型,由于已有默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),不能再定義無(wú)參數(shù)的構(gòu)造函數(shù),但可以定義有參數(shù)的構(gòu)造函
??***引用類型分類
?????--類:C#語(yǔ)言中預(yù)定義了一些類:對(duì)象類(object類)、數(shù)組類、字符串類、自定義類等
?????--接口
?????C#語(yǔ)言引用類型變量無(wú)論如何定義,總是引用類型變量,不會(huì)變?yōu)橹殿愋妥兞俊?br /> ?????C#語(yǔ)言引用類型對(duì)象一般用運(yùn)算符new建立,用引用類型變量引用該對(duì)象。
?????
???(1)對(duì)象類(object類)
???????C#中的所有類型(包括數(shù)值類型)都直接或間接地以object類為基類。
???????對(duì)象類(object類)是所有其它類的基類。任何一個(gè)類定義,如果不指定基類,默認(rèn)object為基類。
???????C#語(yǔ)言規(guī)定,基類的引用變量可以引用派生類的對(duì)象(注意,派生類的引用變量不可以引用基類的對(duì)象),
???????因此,對(duì)一個(gè)object的變量可以賦予任何類型的值
????
???????object關(guān)鍵字是在命名空間System中定義的,是類System.Object的別名
????
????(2)數(shù)組
????????C#語(yǔ)言中數(shù)組是類System.Array類對(duì)象,和java中的數(shù)組用法基本一致,不說(shuō)了。
????(3)string:和java的api中的功能類似,可以對(duì)比學(xué)習(xí),現(xiàn)在先大致了解即可,用到時(shí)再查
????????C#還定義了一個(gè)基本的類string,專門(mén)用于對(duì)字符串的操作。
????????這個(gè)類也是在名字空間System中定義的,是類System.String的別名
????????注意,兩個(gè)字符串的比較比較的是值:string a,b; a==b,而java中時(shí)比的是hashcode
3.加框(boxing)和消框(unboxing)
??
??加框(boxing)和消框(unboxing)是C#語(yǔ)言類型系統(tǒng)提出的核心概念,加框是值類型轉(zhuǎn)換為object(對(duì)象)類型,
??消框是object(對(duì)象)類型轉(zhuǎn)換為值類型。有了加框和消框的概念,對(duì)任何類型的變量來(lái)說(shuō)最終我們都可以看作是object類型
??
??可以理解成java中的拆箱與裝箱操作,java中時(shí)自動(dòng)拆裝箱,這個(gè)需要手動(dòng)操作
??c#中的更加寬泛,需要自己在使用中慢慢理解。
4.關(guān)于運(yùn)算符:和java中的幾乎一致,如有遇到不一致的,就直接去查。
??(1)typeof運(yùn)算符:操作符用于獲得指定類型在system名字空間中定義的類型名字
??例如:
?????Console.WriteLine(typeof(System.Int32));
?????輸出如下:
?????System.Int32
??(2)溢出檢查操作符checked和unchecked
??在進(jìn)行整型算術(shù)運(yùn)算(如+、-、*、/等)或從一種整型顯式轉(zhuǎn)換到另一種整型時(shí),有可能出現(xiàn)運(yùn)算結(jié)果超出這個(gè)結(jié)果所屬類型值域的情況,
??這種情況稱之為溢出。整型算術(shù)運(yùn)算表達(dá)式可以用checked或unchecked溢出檢查操作符,決定在編譯和運(yùn)行時(shí)是否對(duì)表達(dá)式溢出進(jìn)行檢查。
??如果表達(dá)式不使用溢出檢查操作符或使用了checked操作符,常量表達(dá)式溢出,在編譯時(shí)將產(chǎn)生錯(cuò)誤,表達(dá)式中包含變量
??,程序運(yùn)行時(shí)執(zhí)行該表達(dá)式產(chǎn)生溢出,將產(chǎn)生異常提示信息。而使用了unchecked操作符的表達(dá)式語(yǔ)句,即使表達(dá)式產(chǎn)生溢出,
???編譯和運(yùn)行時(shí)都不會(huì)產(chǎn)生錯(cuò)誤提示。但這往往會(huì)出現(xiàn)一些不可預(yù)期的結(jié)果,所以使用unchecked操作符要小心。
??下面的例子說(shuō)明了checked和unchecked操作符的用法:
??using System;
??class Class1{
???????static void Main(string[] args){
???????????const int x=int.MaxValue;
???????????unchecked//不檢查溢出
??????????{
????????????????int z=x*2;//編譯時(shí)不產(chǎn)生編譯錯(cuò)誤,z=-2
????????????????Console.WriteLine("z={0}",z);//顯示-2
???????????}
??????????checked//檢查溢出
?????????{
????????????int z1=(x*2);//編譯時(shí)會(huì)產(chǎn)生編譯錯(cuò)誤
????????????Console.WriteLine("z={0}",z1);
?????????}
???}
???(3)new運(yùn)算符
??????和java不同之處是可以創(chuàng)建值類型的變量(基本數(shù)據(jù)類型),java中只能創(chuàng)建對(duì)象。
??????new操作符可以創(chuàng)建值類型變量、引用類型對(duì)象,同時(shí)自動(dòng)調(diào)用構(gòu)造函數(shù)。
??????例如:
?????????int x=new int();//用new創(chuàng)建整型變量x,調(diào)用默認(rèn)構(gòu)造函數(shù)
?????????Person C1=new Person ();//用new建立的Person類對(duì)象。Person 變量C1對(duì)象的引用
?????????int[] arr=new int[2];//數(shù)組也是類,創(chuàng)建數(shù)組類對(duì)象,arr是數(shù)組對(duì)象的引用需注意的是,
?????????int x=new int()語(yǔ)句將自動(dòng)調(diào)用int結(jié)構(gòu)不帶參數(shù)的構(gòu)造函數(shù),給x賦初值0,x仍是值類型變量,
?????????不會(huì)變?yōu)橐妙愋妥兞?br /> ?4.控制語(yǔ)句
???控制語(yǔ)句幾乎和java相同,這里只之處不同之處,可以會(huì)有遺漏的地方,請(qǐng)指正,需要在使用中體會(huì),
???這里只是快速的從java到c#的學(xué)習(xí)過(guò)程。
???(1)foreach(類型 變量名 in 表達(dá)式) 循環(huán)語(yǔ)句
??????其中表達(dá)式必須是一個(gè)數(shù)組或其它集合類型,每一次循環(huán)從數(shù)組或其它集合中逐一取出數(shù)據(jù),
??????賦值給指定類型的變量,該變量可以在循環(huán)語(yǔ)句中使用、處理,但不允許修改變量,
??????該變量的指定類型必須和表達(dá)式所代表的數(shù)組或其它集合中的數(shù)據(jù)類型一致。
??????例子:
?????????using System;class Test()
????????{
?????????????public static void Main(){
?????????????????int[] list={10,20,30,40};//數(shù)組
?????????????????foreach(int m in list)
????????????????????Console.WriteLine("{0}",m);
????????????}
????????}
對(duì)于一維數(shù)組,foreach語(yǔ)句循環(huán)順序是從下標(biāo)為0的元素開(kāi)始一直到數(shù)組的最后一個(gè)元素。
????????對(duì)于多維數(shù)組,元素下標(biāo)的遞增是從最右邊那一維開(kāi)始的。同樣break和continue可以出現(xiàn)在foreach語(yǔ)句中,功能不變
????(2)異常處理語(yǔ)句和java相同,try,catch,finally
?5.類的繼承
???(1)和java中的類的繼承幾乎一樣,都是單繼承,構(gòu)造函數(shù)不能繼承
???????語(yǔ)法格式有區(qū)別:
???????父類:Person
???????子類:Employee
???????子類這么定義:
???????class Employee:Person{
???????}
????(2)base關(guān)鍵字
???????和java中的supper關(guān)鍵字用法一致
?????(3)類的成員類型
????????局部變量:在for、switch等語(yǔ)句中和類方法中定義的變量,只在指定范圍內(nèi)有效。
????????字段:即類中的變量或常量,包括靜態(tài)字段、實(shí)例字段、常量和只讀字段。
方法成員:包括靜態(tài)方法和實(shí)例方法。
????????屬性:按屬性指定的get方法和Set方法對(duì)字段進(jìn)行讀寫(xiě)。屬性本質(zhì)上是方法。
????????事件:代表事件本身,同時(shí)聯(lián)系事件和事件處理函數(shù)。
????????索引指示器:允許象使用數(shù)組那樣訪問(wèn)類中的數(shù)據(jù)成員。
????????操作符重載:采用重載操作符的方法定義類中特有的操作。
????????構(gòu)造函數(shù)和析構(gòu)函數(shù)。
?????(4)修飾符
????????c#的類修飾符和java的比較
??????????????????????????????????C# ?????????????????????????????????java
???????private ????????????只能本類訪問(wèn) ????????????????????????????只能本類訪問(wèn)
???????protected ???????本類,派生類 ???????????????????????????????本類,子類,同包
???????public ??????????外部程序 ???????????????????????????????????本程序
???????internal ????????本程序 ?????????????????????????????????????類似于java的public?
??????(5)字段和屬性
?????????字段:變量或者常量
?????????屬性:帶有g(shù)et,set的方法(與java的不同,java帶有set,get方法的成員變量叫屬性,我此處理解的可能有誤)
?????(6)
?????????靜態(tài)字段:用static聲明的字段,和java中的靜態(tài)變量相同
?????????實(shí)例字段:普通的變量,和java中的成員變量相同
?????????常量:使用const修飾聲明的常量,和java中的static final 修飾的用法相同
?????????只讀字段:使用readonly修飾聲明的字段,它只能在字段聲明中賦值或者在構(gòu)造函數(shù)中賦值,java中沒(méi)有對(duì)應(yīng)的定義。
?????(7)C#中的屬性
?????????屬性不是字段,但必然和類中的某個(gè)或某些字段相聯(lián)系,屬性定義了得到和修改相聯(lián)系的字段的方法。
?????????C#中的屬性更充分地體現(xiàn)了對(duì)象的封裝性:不直接操作類的數(shù)據(jù)內(nèi)容,而是通過(guò)訪問(wèn)器進(jìn)行訪問(wèn),
?????????借助于get和set方法對(duì)屬性的值進(jìn)行讀寫(xiě)。訪問(wèn)屬性值的語(yǔ)法形式和訪問(wèn)一個(gè)變量基本一樣,
?????????使訪問(wèn)屬性就象訪問(wèn)變量一樣方便,符合習(xí)慣。
?????????在類的基本概念一節(jié)中,定義一個(gè)描述個(gè)人情況的類Person,其中字段name和age是私有字段,記錄姓名和年齡,
?????????外部通過(guò)公有方法SetName和SetAge修改這兩個(gè)私有字段。現(xiàn)在用屬性來(lái)描述姓名和年齡。例子如下:
?????????using System;
public class Person
{ private string P_name="張三";//P_name是私有字段
private int P_age=12;//P_age是私有字段
public void Display()//類的方法聲明,顯示姓名和年齡
{ Console.WriteLine("姓名:{0},年齡:{1}",P_name,P_age);
}
public string Name//定義屬性Name
{ get
{ return ?P_name;}
set
{ P_name=value;}
}
public int Age//定義屬性Age
{ get
{ return ?P_age;}
set
{ P_age=value;}
}
}
public class Test
{ public static void Main()
{ Person OnePerson= new Person();
OnePerson.Name="田七";//value="田七",通過(guò)set方法修改變量P_Name
string s=OnePerson.Name;//通過(guò)get方法得到變量P_Name值
OnePerson.Age=20;//通過(guò)定義屬性,既保證了姓名和年齡按指定方法修改
int x=OnePerson.Age;//語(yǔ)法形式和修改、得到一個(gè)變量基本一致,符合習(xí)慣
OnePerson.Display();
}
}
在屬性的訪問(wèn)聲明中,只有set訪問(wèn)器表明屬性的值只能進(jìn)行設(shè)置而不能讀出,只有g(shù)et訪問(wèn)器表明屬性的值是只讀的不能改寫(xiě),
????????同時(shí)具有set訪問(wèn)器和get訪問(wèn)器表明屬性的值的讀寫(xiě)都是允許的。
雖然屬性和字段的語(yǔ)法比較類似,但由于屬性本質(zhì)上是方法,因此不能把屬性當(dāng)做變量那樣使用,也不能把屬性作為引用型參數(shù)或輸出參數(shù)來(lái)進(jìn)行傳遞。
?6.方法參數(shù)的種類
????
???c#的參數(shù)類型比較多,比javav的復(fù)雜好多
???-- 方法修飾符包括new、public、protected、internal、private、static、virtual、sealed、override、abstract和extern
???-- C#語(yǔ)言的方法可以使用如下四種參數(shù)(請(qǐng)注意和參數(shù)類型的區(qū)別):
??????值參數(shù),不含任何修飾符。
??????引用參數(shù),以ref修飾符聲明。
??????輸出參數(shù),以out修飾符聲明。
??????數(shù)組參數(shù),以params修飾符聲明。
???1.值參數(shù)
????(1)當(dāng)用值參數(shù)向方法傳遞參數(shù)時(shí),程序給實(shí)參的值做一份拷貝,并且將此拷貝傳遞給該方法,被調(diào)用的方法不會(huì)修改實(shí)參的值,
????所以使用值參數(shù)時(shí),可以保證實(shí)參的值是安全的。
????(2)如果參數(shù)類型是引用類型,例如是類的引用變量,則拷貝中存儲(chǔ)的也是
????對(duì)象的引用,所以拷貝和實(shí)參引用同一個(gè)對(duì)象,通過(guò)這個(gè)拷貝,可以修改實(shí)參所引用的對(duì)象中的數(shù)據(jù)成員。
?????值參數(shù)和java中的參數(shù)傳遞一致。
??2.引用參數(shù)
????有時(shí)在方法中,需要修改或得到方法外部的變量值,C語(yǔ)言用向方法傳遞實(shí)參指針來(lái)達(dá)到目的,C#語(yǔ)言用引用參數(shù)。
????當(dāng)用引用參數(shù)向方法傳遞實(shí)參時(shí),程序?qū)褜?shí)參的引用,即實(shí)參在內(nèi)存中的地址傳遞給方法,方法通過(guò)實(shí)參的引用,
????修改或得到方法外部的變量值。引用參數(shù)以ref修飾符聲明。注意在使用前,實(shí)參變量要求必須被設(shè)置初始值。
????
????這個(gè)類似于C語(yǔ)言中傳遞地址,然后根據(jù)地址找到相應(yīng)的內(nèi)存空間,并可以修改這個(gè)內(nèi)存空間的值。
??3. 輸出參數(shù)
????為了把方法的運(yùn)算結(jié)果保存到外部變量,因此需要知道外部變量的引用(地址)。輸出參數(shù)用于向方法傳遞外部變量引用(地址),
????所以輸出參數(shù)也是引用參數(shù),與引用參數(shù)的差別在于調(diào)用方法前無(wú)需對(duì)變量進(jìn)行初始化。在方法返回后,傳遞的變量被認(rèn)為經(jīng)過(guò)了初始化。
????
????這個(gè)也類似于c語(yǔ)言中實(shí)現(xiàn)多個(gè)返回值的實(shí)現(xiàn)方式,區(qū)別是初始化問(wèn)題,當(dāng)然java也可以實(shí)現(xiàn)引用的修改,但是對(duì)于基本數(shù)據(jù)
????類型做不到,只能用基本數(shù)據(jù)類型的封裝類去實(shí)現(xiàn)。 ???
????值參數(shù)、引用參數(shù)和輸出參數(shù)的使用見(jiàn)下例
????using System;
class g{public int a=0;}//類定義
class Class1
{ public static void F1(ref char i)//引用參數(shù)
{ i='b';}
public static void F2(char i)//值參數(shù),參數(shù)類型為值類型
{ i='d';}
public static void F3(out char i)//輸出參數(shù)
{ i='e';}
public static void F4(string s)//值參數(shù),參數(shù)類型為字符串
{ s="xyz";}
public static void F5(g gg)//值參數(shù),參數(shù)類型為引用類型
{ gg.a=20;}
public static void F6(ref string s)//引用參數(shù),參數(shù)類型為字符串
{ s="xyz";}
static void Main(string[] args)
{ char a='c';
string s1="abc";
F2(a);//值參數(shù),不能修改外部的a
Console.WriteLine(a);//因a未被修改,顯示c
F1(ref a);//引用參數(shù),函數(shù)修改外部的a的值
Console.WriteLine(a);//a被修改為b,顯示b
Char j;
F3(out j);//輸出參數(shù),結(jié)果輸出到外部變量j
Console.WriteLine(j);//顯示e
F4(s1);//值參數(shù),參數(shù)類型是字符串,s1為字符串引用變量
Console.WriteLine(s1);//顯示:abc,字符串s1不被修改
g g1=new g();
F5(g1);//值參數(shù),但實(shí)參是一個(gè)類引用類型變量
Console.WriteLine(g1.a.ToString());//顯示:20,修改對(duì)象數(shù)據(jù)
F6(ref s1);//引用參數(shù),參數(shù)類型是字符串,s1為字符串引用變量
Console.WriteLine(s1);//顯示:xyz,字符串s1被修改
}
}
??
?????4.數(shù)組參數(shù)
數(shù)組參數(shù)使用params說(shuō)明,
(1)如果形參表中包含了數(shù)組參數(shù),那么它必須是參數(shù)表中最后一個(gè)參數(shù),數(shù)組參數(shù)只允許是一維數(shù)組。
比如string[]和string[][]類型都可以作為數(shù)組型參數(shù)
(2)數(shù)組型參數(shù)不能再有ref和out修飾符。見(jiàn)下例:
using System;
class Class1
{ static void F(params int[] args)//數(shù)組參數(shù),有params說(shuō)明
{ Console.Write("Array contains {0} elements:",args.Length);
foreach (int i in args)
Console.Write(" {0}",i);
Console.WriteLine();
}
static void Main(string[] args)
{ int[] a = {1,2,3};
F(a);//實(shí)參為數(shù)組類引用變量a
F(10, 20, 30, 40);//等價(jià)于F(new int[] {60,70,80,90});
F(new int[] {60,70,80,90});//實(shí)參為數(shù)組類引用
F();//等價(jià)于F(new int[] {});
F(new int[] {});//實(shí)參為數(shù)組類引用,數(shù)組無(wú)元素
}
}
程序輸出
Array contains 3 elements: 1 2 3
Array contains 4 elements: 10 20 30 40
Array contains 4 elements: 60,70,80,90
Array contains 0 elements:
Array contains 0 elements:
??
和java中的可變參數(shù)用法類似,在傳參的時(shí)候相同,定義時(shí)不同,但是都必須是參數(shù)中的最后一個(gè)參數(shù)
????5.C#和java中的靜態(tài)方法和成員方法用法相同
6. C#的方法和構(gòu)造器的重載和java的用法相同
7. ?操作符重載:java中操作符不能重載
????
?操作符重載是將C#語(yǔ)言中的已有操作符賦予新的功能,但與該操作符的本來(lái)含義不沖突,
??使用時(shí)只需根據(jù)操作符出現(xiàn)的位置來(lái)判別其具體執(zhí)行哪一種運(yùn)算。操作符重載,實(shí)際是定義了一個(gè)操作符函數(shù),操作符函數(shù)聲明的格式如下:
static public 函數(shù)返回類型 operator 重新定義的操作符(形參表)
C#語(yǔ)言中有一些操作符是可以重載的,例如:+ - ! ~ ++ -- true false * / % & | ^ << >> == != > < >= <=等等。
但也有一些操作符是不允許進(jìn)行重載的,例如:=, &&, ||, ?:, new, typeof, sizeof, is等。
????8.this關(guān)鍵字
this關(guān)鍵字和java中的this用法一致。
注意:java中的supper在C#中使用base
9.類的多態(tài)
C#支持兩種類型的多態(tài)性,
第一種是編譯時(shí)的多態(tài)性,一個(gè)類的對(duì)象調(diào)用若干同名方法,系統(tǒng)在編譯時(shí),根據(jù)調(diào)用方法的實(shí)參類型及實(shí)參的個(gè)數(shù)決定調(diào)用那個(gè)同名方法,
實(shí)現(xiàn)何種操作。編譯時(shí)的多態(tài)性是通過(guò)方法重載來(lái)實(shí)現(xiàn)的。
第二種是運(yùn)行時(shí)的多態(tài)性,是在系統(tǒng)運(yùn)行時(shí),不同對(duì)象調(diào)用一個(gè)名字相同,參數(shù)的類型及個(gè)數(shù)完全一樣的方法,會(huì)完成不同的操作。
C#運(yùn)行時(shí)的多態(tài)性通過(guò)虛方法實(shí)現(xiàn)。在類的方法聲明前加上了virtual修飾符,被稱之為虛方法,反之為非虛方法。
第一種多態(tài)寫(xiě)法和java相同,但是用法不同,方法執(zhí)行時(shí),執(zhí)行基類的方法
第二中多態(tài)和java寫(xiě)法不同,子類繼承的寫(xiě)法也不同,但是和java繼承的意義相同。
基類返回值前用virtual關(guān)鍵字修飾,派生類繼承的時(shí)候在返回值前加上一個(gè)override關(guān)鍵字去修飾。
10:抽象類和抽象方法
和java對(duì)比基本一樣,只是在寫(xiě)法上有少許差別,java可以用注解,不知C#是否可以
11.密封類和密封方法
C#用sealed修飾的類或者方法叫密封類和密封方法,和java中用final修飾的類和方法相同,不能被繼承
12.接口和java中的接口意義和用法幾乎相同,
區(qū)別是,C#在接口中可以有方法、屬性、索引指示器和事件,不能是常量、域、操作符、構(gòu)造函數(shù)或析構(gòu)函數(shù),不能包含任何靜態(tài)成員。
13.代表
在這里要介紹的是C#的一個(gè)引用類型----代表(delegate),也翻譯為委托,可以當(dāng)做java中的代理,也可以理解成c中的指針的傳遞
語(yǔ)法自己去查,比較簡(jiǎn)單。
14.事件
事件是C#語(yǔ)言內(nèi)置的語(yǔ)法,可以定義和處理事件,為使用組件編程提供了良好的基礎(chǔ)
15.事件驅(qū)動(dòng)
Windows操作系統(tǒng)把用戶的動(dòng)作都看作消息,C#中稱作事件,例如用鼠標(biāo)左鍵單擊按鈕,發(fā)出鼠標(biāo)單擊按鈕事件。
Windows操作系統(tǒng)負(fù)責(zé)統(tǒng)一管理所有的事件,把事件發(fā)送到各個(gè)運(yùn)行程序。各個(gè)程序用事件函數(shù)響應(yīng)事件,這種方法也叫事件驅(qū)動(dòng)。
和android中的button等view的事件的處理基本類似。
16.
索引指示器
在C#語(yǔ)言中,數(shù)組也是類,比如我們聲明一個(gè)整型數(shù)數(shù)組:int[] arr=new int[5],實(shí)際上生成了一個(gè)數(shù)組類對(duì)象,
arr是這個(gè)對(duì)象的引用(地址),訪問(wèn)這個(gè)數(shù)組元素的方法是:arr[下標(biāo)],在數(shù)組類中,使用索引訪問(wèn)元素是如何實(shí)現(xiàn)的呢?
是否可以定義自己的類,用索引訪問(wèn)類中的數(shù)據(jù)成員?索引指示器(indexer)為我們提供了通過(guò)索引方式方便地訪問(wèn)類的數(shù)據(jù)成員的方法。
可以這么理解,就是自己定義的數(shù)組,可以通過(guò)下表訪問(wèn)其中的元素
17,名字空間或者叫命名空間:namespace。
用法和java中的包pacager類似
命名空間也是用來(lái)唯一識(shí)別類的,和包相同
命名空間可以定義子命名空間,包可以定義子包。
命名空間和java中的不同,除了寫(xiě)法不同外,命名空間只是邏輯上的分類。
18:和java不同還有
C#可以使用指針,通過(guò)unsafe關(guān)鍵字可以修飾方法或者代碼行,說(shuō)明這個(gè)是不安全的代碼,需要使用c的指針
C#的方法,變量,參數(shù)首字母大寫(xiě),而java的是小寫(xiě)
發(fā)現(xiàn)C#更加的面相對(duì)象,但是還留有C和C++的影子。
當(dāng)然以上只是C#和java基本語(yǔ)法的對(duì)比學(xué)習(xí),可以讓java程序員快速的學(xué)習(xí)C#語(yǔ)言,能看懂C#程序,這些已經(jīng)足夠了,
只是熟悉的問(wèn)題。關(guān)于C#的sdk的api的學(xué)習(xí)也要和java的對(duì)應(yīng)學(xué)習(xí),這樣學(xué)習(xí)會(huì)非常快速,也能加深對(duì)java的理解。
---------------------?
作者:com360?
來(lái)源:CSDN?
原文:https://blog.csdn.net/com360/article/details/8201930?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的java程序员学C#基本语法两个小时搞定(对比学习)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android开发者珍藏必备【学习资料篇
- 下一篇: JAVA程序员看C#的精华与糟粕