C#讲义(三)

    技术2022-05-11  76

    name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3528650120430763&dt=1183890684015&lmt=1183890684&format=468x60_as&output=html&correlator=1183890684000&url=http://gmai9999.googlepages.com/home&ad_type=text_image&ui=rc:0&cc=100&flash=9&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="468" scrolling="no" height="60" allowtransparency="allowtransparency">   2.1面向对象   Java和C#都是完全面向对象的语言。在面向对象编程的三大原则方面,这两种语言接近 得不能再接近。   继承:这两种语言都支持类的单一继承,但类可以实现多个接口。所有类都从一个公共 的基类继承。   封装与可见性:无论是在Java还是C#中,你都可以决定类成员是否可见。除了C#的inte rnal访问修饰符之外,两者的可见性机制非常相似。   多态性:Java和C#都支持某些形式的多态性机制,且两者实现方法非常类似。     2.2可访问性   类的每个成员都有特定类型的可访问性。C#中的访问修饰符与Java中的基本对应,但多 出了一个internal。简而言之,C#有5种类型的可访问性,如下所示:   public:成员可以从任何代码访问。 protected:成员只能从派生类访问。 internal:成员只能从同一程序集的内部访问。 protected internal:成员只能从同一程序集内的派生类访问。 private:成员只能在当前类的内部访问。   2.3接口   接口这个概念在C#和Java中非常相似。接口的关键词是interface,一个接口可以扩展一 个或者多个其他接口。按照惯例,接口的名字以大写字母“I”开头。下面的代码是C#接 口的一个例子,它与Java中的接口完全一样:   interface IShape { void Draw(); }   扩展接口的语法与扩展类的语法一样。例如,下例的IRectangularShape接口扩展IShap e接口(即,从IShape接口派生出IRectangularShape接口)。   interface IRectangularShape: IShape { int GetWidth(); }   如果你从两个或者两个以上的接口派生,父接口的名字列表用逗号分隔,如下面的代码 所示:   interface INewInterface: IParent1, IParent2 { }   然而,与Java不同,C#中的接口不能包含域(Field)。   另外还要注意,在C#中,接口内的所有方法默认都是公用方法。在Java中,方法声明可 以带有public修饰符(即使这并非必要),但在C#中,显式为接口的方法指定public修 饰符是非法的。例如,下面的C#接口将产生一个编译错误。   interface IShape { public void Draw(); }   2.4库   C#没有自己的类库。但是,C#共享了.NET的类库。当然,.NET类库也可以用于其他.NET 语言,比如VB.NET或者JScript.NET。值得一提的是StringBuilder类,它是对String类 的补充。StringBuilder类与Java的StringBuffer类非常相似。   2.5垃圾收集   C++已经让我们认识到手工管理内存是多么缺乏效率和浪费时间。当你在C++中创建了一个对象,你就必须手工地拆除这个对象。代码越复杂,这个任务也越困难。Java用垃圾收集器来解决这个问题,由垃圾收集器搜集不再使用的对象并释放内存。C#同样采用了这种方法。应该说,如果你也在开发一种新的OOP语言,追随这条道路是一种非常自然的选择。C#仍旧保留了C++的内存手工管理方法,它适合在速度极端重要的场合使用,而在Java中这是不允许的。   2.6   C#类除了可以拥有域(Field)之外,它还可以拥有属性(Property)。属性是一个与类或对象关联的命名的特征。属性是域的一种自然扩展——两者都是有类型、有名字的类成员。然而,和域不同的是,属性不表示存储位置;相反,属性拥有存取器(accessor),存取器定义了读取或者写入属性值时必须执行的代码。因此,属性提供了一种把动作和读取、写入对象属性值的操作关联起来的机制,而且它们允许属性值通过计算得到。   2.7、包装和解除包装   在面向对象的编程语言中,我们通常使用的是对象。但为了提高速度,C#也提供了简单数据类型。因此,C#程序既包含一大堆的对象,又有大量的值。在这种环境下,让这两者协同工作始终是一个不可回避的问题,你必须要有一种让引用和值进行通信的方法。   在C#以及.NET运行时环境中,这个“通信”问题通过包装(Boxing)和解除包装(Unboxing)解决。包装是一种让值类型看起来象引用类型的处理过程。当一个值类型(简单数据类型)被用于一个要求或者可以使用对象的场合时,包装操作自动进行。包装一个value-type值的步骤包括:分配一个对象实例,然后把value-type值复制到对象实例。   解除包装所执行的动作与包装相反,它把一个引用类型转换成值类型。解除包装操作的步骤包括:首先检查并确认对象实例确实是给定value-type的一个经过包装的值,然后从对象实例复制出值。   Java对该问题的处理方式略有不同。Java为每一种简单数据类型提供了一个对应的类封 装器。例如,用Integer类封装int类型,用Byte类封装byte类型。   3.JAVA是C#的竞争对手       尽管.NET是微软一手缔造的,它并不是只能在Windows上使用。微软准备尽力为那些COM对象提供传统帮助(所有的OLE, ActiveX等等在下一代Viual Studio推出后,都将成为一个legacy平台)。但.NET不会围绕COM建造。新平台无疑将补充COM,并与它几乎天衣无缝地配合,但一点也不会依靠COM。这表明这种结构本身能够Macintosh, UNIX. BeOX展开。这样命名,是因为除了CLS构架是平台独立的,C#将用到的和所有遵从CLS的数据库也是平台独立的。也就是说,它们都是遵从CLS的,如果一个本机MSIL编译程序在平台上有效,那么它们能在运行时刻为任何结构进行编译。微软也积极争取被ECMA标准接纳,他们先前的Javascript已被接纳。 当Visual Studio. NET推出时,开发团体肯定会有不同的反应。"微软又开发了一个新平台",这已吓倒那些本来对微软平台统治忧心忡忡的人了。然而更重要的是C#或.NET战略不会对原始C++构成太大威胁,那么有理由推论C#和.NET将是Java的有力竞争者。考虑相反方面:Java VM靠翻译字节码来运行应用程序。CLS在运行时刻本机编译。Java平台只支持Java语言。.NET只支持MSIL,但一些无限制的高级语言如C#,Visual Basic,甚至Eiffel和COBOL都能启动MSIL。Java运用执行转接提供真正的OOP技术。MSIL,C#也是如此。在Java平台,简单地移动平级文件,项目就可以展开为产品目录。据说,.NET平台的项目也可轻松展开而不像以registry-happy Com为基础的项目。或许Java平台真正的优势只在于政治上的正确性--它不是微软搞出来的,且目前有成千上万的执着的宗教追随者。       一、总结:谁适合使用C#   强大,灵活                                                                                                开发效率,易用性 C/C++                              C#                                                       VB,Delphi   C#是适用于企业级编程的语言。适合Windows平台上的RAD.   C和C++已经成为广泛的应用在商用软件的开发中的开发语言。但是C和C++的灵活性是牺牲了开发效率的。如果与其他的开发语言相比(比如说VB,Delphi),相同功能的C/C++软件通常会需要更长的开发周期,要写更多的代码。   最后,C#是好还是不好?那么,因为这里的“继承”指对接口界面的再执行,所以,它不是真正的OOP。如果你是微软,亦或如果你依靠微软技术而不准备切换平台,那C#是很棒的,并将为VB程序设计师们搬运Java和C++上的技巧提供很好的基础(因为语法是共享的)。但因为微软将全力推出C#,所以,Java和C++的拥护者们肯定会设计出新的语言,予以还击。同时,C#不一定可转移到其他平台,也不能真正体现OOP的价值,甚至对OOP的初学者有害无益。        C#适合有一定C/C++编程经验,希望在Windows平台上进行快速应用开发(RAD)的开发者。 name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3528650120430763&dt=1183890684015&lmt=1183890684&format=468x60_as&output=html&correlator=1183890684000&url=http://gmai9999.googlepages.com/home&ad_type=text_image&ui=rc:0&cc=100&flash=9&u_h=768&u_w=1024&u_ah=738&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="468" scrolling="no" height="60" allowtransparency="allowtransparency">

    最新回复(0)