|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C#是不行的,比如说美国的航天飞船里就有java开发的程序以上是我的愚见,其实不管那种语言,你学好了,都能找到好的工作,对照 良多人说C#是微软用来和Java对抗的兵器,由于两者在很年夜水平上有着惊人的类似,只管云云,二者分歧的中央也良多,所谓“于渺小处见差别”。那末二者的类似和区分都在甚么中央呢?我们从明天入手下手,会从各个角度来对照C#和Java的特性,但愿能对正在进修、利用C#的伴侣有所匡助。
1、C#和.NET平台的概貌
2000年6月,微软公布C#言语和.NET平台。C#言语是一种强范例的,面向对象的言语,它具有语法复杂、表达力强的特性,而.NET平台则是组成微软的“.NET企图”的基石。
.NET平台的中心包含两方面,一方面就是出名的通用言语运转机(CommonLanguageRuntime),固然这个名词起得流畅了点,不外人人能够拿它和Java的假造机来作对照,两者完成的义务大抵不异;另外一方面就是一年夜堆通用函数库,这些库函数能够被多种言语挪用,而且经由过程编译都发生一种配合的两头言语(IntermediateLanguage),这类言语也能够拿Java的字节码来类比,固然完成的体例有些纷歧样。
2、C#和Java
上面复杂地把C#和Java的类似处列出来,固然在这里我们重点会商的是C#和Java的分歧点,可是懂得一下两者的不异的地方也是很有需要的。
两者都编译成跨平台的、跨言语的代码,而且代码只能在一个受把持的情况中运转
主动接纳渣滓内存,而且打消了指针(在C#中可使用指针,不外必需说明unsafe关头字)
都不必要头文件,一切的代码都被“包(package)”限定在某个局限内,而且由于没有头文件,以是打消了类界说的轮回依附
一切的类都是从对象派生出来,而且必需利用New关头字分派内存
用对象加锁的体例来撑持多线程
都具有接口(interface)的观点
外部类
承继类的时分不会以某种特定的会见权限来承继;
没有全局函数大概常量,统统必需属于类;
数组大概字符串都自带长度盘算和界限反省;
只利用“.”操纵符,没有“->”和“::”;
“null”、“boolean”和“bool”成了关头字;
任何变量均在利用行进行初始化;
不克不及利用整数来前往到if前提语句中,必需利用布尔值;
“Try”模块后能够有“finally”;
3.属性(Property)
属性的观点对人人来讲应当是很熟习的,类成员函数能够自在地会见本类中的任何属性成员。不外若要从一个类中往会见另外一个类中的属性,那就对照贫苦了,以是良多时分我们利用Getxxx和Setxxx办法,如许看起来显得极不天然,好比用Java大概C++,代码是如许的:
foo.setSize(getSize()+1);
label.getFont().setBold(true);
可是,在C#中,如许的办法被“属性化”了。一样的代码,在C#就酿成了:
foo.size++;
label.font.bold=true;
能够看出来,C#明显更简单浏览和了解。我们从这个“属性办法”的子程序代码中,也能够看到相似情形:
Java/C++:
publicintgetSize()
{
returnsize;
}
publicvoidsetSize(intvalue)
{
size=value;
}
C#:
publicintSize
{
get{returnsize;}
set{size=value;}
}
为了辨别这类属性化的办法和类的属性成员,在C#中把属性成员称作“域(field)”,而“属性”则成为这类“属性化的办法”公用的名词。特地说一句,实在如许的属性化办法在VB和DELPHI中是常常碰着的,在VB中它也就叫属性。
别的,在C#中Get和Set必需成对呈现,一种属性不克不及只要Get而没有Set(在Java和C++中就能够只要Get大概只要Set),C#中如许做的优点在于便于保护,假设要对某种属性举行修正,就会同时注重Get和Set办法,同时修正,不会改了这个忘了谁人。
4、对象索引机制(Indexer)
C#中引进了对象索引机制。说得分明点,对象索引实在就是对象数组。这里和上一节中的属性接洽起来说一下,属性必要埋没Get和Set办法,而在索引机制中,各个对象的Get大概Set办法是表露出来的。好比上面的例子就对照分明地申明了这一点。
publicclassSkyscraper
{
Story[]stories;
publicStorythis[intindex]{
get{
returnstories[index];
}
set{
if(value!=null){
stories[index]=value;
}
}
}
...
}
SkyscraperempireState=newSkyscraper(...);
empireState[102]=newStory("TheTopOne",...);
呵呵,有了这类特征,我们就再不必怕教室上先生叫我们写对象数组这类程序了。
5.指代(Delegate)
指代这个玩意很出格,它有点象指针,但又不完整是,不外人人仍是能够把它了解为一品种型平安的、面向对象的指针。(甚么是范例平安和面向对象就不必讲了吧?)特地提一句,有良多书上把Delegate翻译成代办署理,我以为如许翻不敷切实,翻译成“指代”更得当些,事理上符合,而且还切合它的原本意义――微软原本就是用Delegate来“代替指针”,以是叫“指代”,呵呵。
提及指代,大概至今Sun还会对它忿忿不已,为何呢?由于在Sun的尺度Java中是没有这个工具的,它是微软99年公布的MSVJ++6增加的“新特征”。为此,两家公司吵得不亦乐乎,而且还专门在网上写了大批文章相互打击,有乐趣的伴侣能够往看看(只要英文版)。
http://www.Javasoft.com/docs/white/delegates.html
http://msdn.microsoft.com/visualj/technical/articles/delegates/truth.asp
话回正传,指代有甚么特性呢?一个分明的特性就是它具有了指针的举动,就好象从Java又倒回到了C++。在C#中,指代完成的功效也许和C++内里的指针,和Java中的接口相称。可是,指代比起C++的“正宗指针”来又要拙劣一些,由于它能够同时具有多个办法,相称于C++内里的指针能同时指向多个函数,而且是范例平安的,这一点表现了它的“对象”特征;而比起Java的接口来,指代拙劣的中央在于它能能够不经由外部类就挪用函数,大概用大批代码就可以挪用多种函数,这一点表现了它的“指针”特征。呵呵,很有“波粒二象性”的滋味吧?指代最主要的使用在于关于事务的处置,下一节我们将重点先容。
6、事务(Event)
C#对事务是间接撑持的(这个特性也是MSVJ所具有的)。以后良多支流程序言语处置事务的体例各不不异,Delphi接纳的是函数指针(这在Delphi中的术语是“closure”)、Java用改编类来完成、VC用WindowsAPI的动静体系,而C#则间接利用delegate和event关头字来办理这个成绩。上面让我们来看一个例子,例子中会给人人举作声明、挪用和处置事务的全历程。
//起首是指代的声明,它界说了叫醒某个函数的事务旌旗灯号
publicdelegatevoidScoreChangeEventHandler(intnewScore,refboolcancel);
//界说一个发生事务的类
publicclassGame
{
//注重这里利用了event关头字
publiceventScoreChangeEventHandlerScoreChange;
intscore;
//Score属性
publicintScore
{
get{
returnscore;
}
set{
if(score!=value)
{
boolcancel=false;
ScoreChange(value,refcancel);
if(!cancel)
score=value;
}
}
}
//处置事务的类
publicclassReferee
{
publicReferee(Gamegame)
{
//裁判卖力调剂竞赛中的分数变更
game.ScoreChange+=newScoreChangeEventHandler(game_ScoreChange);
}
//注重这里的函数是如何和ScoreChangeEventHandler的旌旗灯号对上号的
privatevoidgame_ScoreChange(intnewScore,refboolcancel)
{
if(newScore<100)
System.Console.WriteLine("GoodScore");
else
{
cancel=true;
System.Console.WriteLine("NoScorecanbethathigh!");
}
}
}
//主函数类,用于测试上述特征
publicclassGameTest
{
publicstaticvoidMain()
{
Gamegame=newGame();
Refereereferee=newReferee(game);
game.Score=70;
game.Score=110;
}
}
在主函数中,我们创立了一个game对象和一个裁判对象,然后我们经由过程改动竞赛分数,来察看裁判对此会有甚么呼应。
请注重,我们的这个体系中,Game对象是感到不到裁判对象的存在的,Game对象在这里只卖力发生事务,至于有谁会来聆听这个事务,并为之作出反响,Game对象是不作任何亮相的。
我们注重到,在裁判类的Referee函数中,Game.ScoreChange前面利用了+=和-=操纵符,这是甚么意义呢?回到我们界说ScoreChange的中央,能够发明ScoreChange是用event关头字润色的,那末这里的意义就很分明了:ScoreChange是一个事务,而事务被触发后必要响应的事务处置机制,+=/-=就是为这个事务增添/移除绝对应的事务处置程序,并且,并非一个事务只能对应一个处置程序,我们还能够用这两个操纵符为统一事务增添/移除数个事务处置程序。怎样?很便利吧!
在实践使用中,和我们下面讲的(比赛-裁判)机制很邻近的体系就是图形用户界面体系了。Game对象能够看做是图形界面上的小零件,而得分事务就相称于用户输出事务,而裁判就相称于响应的使用程序,用于处置用户输出。
指代机制的初次表态是在MSVJ里,它是由AndersHejlsberg创造的,如今又用到了C#中。指代用在Java言语中的成果,则间接招致了微软和Sun之间对类和指针的干系发生了大批的争辩和切磋。成心思的是,Java的创造者JamesGosling十分滑稽地称号指代的创造者AndersHejlsberg为“‘函数指针’师长教师”,由于AndersHejlsberg老是千方百计地把指针变相地往各类言语中放;不外有人在看了Java中大批地利用了各类类后,也戏称Java的创造者JamesGosling为“‘全都是类’师长教师”,真是个中味道,尽在不言中啊。
其实产生见解的过程就是训练自己发现问题,分析问题的能力。根据以上的认识我想谈下传统的学习与通过视频独立学习的优缺点: |
|