科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件总体了解C#(9 类型一致)

总体了解C#(9 类型一致)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

大多数语言都有基本类型(int、long等等)。高级类型最终是由基本类型构成的。能以同样的方式处理基本类型和高级类型通常来说是有用处的。

作者:荣耀翻译 来源:soft6 2008年5月15日

关键字: 类型 了解 C# Windows

  • 评论
  • 分享微博
  • 分享邮件

9.类型一致

大多数语言都有基本类型(int、long等等)。高级类型最终是由基本类型构成的。能以同样的方式处理基本类型和高级类型通常来说是有用处的。例如,如果集合可以象包容sting那样包容int是有用的。为此,Smalltalk通过牺牲些许效率象处理string或Form一样来处理int和long。Java试图避免这个效率损失,它象C和C++那样处理基本类型,但又为每一个基本类型提供了相应的包装类—int包装为Integer,double包装为Double。C++模板参数可接受任何类型,只要该类型提供了模板定义的操作的实现。

【译注:在Java中,你可以这么写:

int i = 1;

double d = 1.1;

Integer iObj = new Integer(1);

Double dObj = new Double(1.1);

以下写法是错误的:

int I = new int(1);

Integer iObj = 1;

C#对该问题提供了一个不同的解决方案。在上一节里,我介绍了C#中的结构,指出基本类型不过是结构的一个别名而已。既然结构拥有所有对象类型拥有的方法,那代码就可以这么写:

int i = 5;

System.Console.WriteLine (i.ToString());

如果我们想象使用一个对象那样使用一个结构,C#将为你装箱该结构为对象,当你再次需要使用结构时,可以通过拆箱实现:

Stack stack = new Stack ();

stack.Push (i); // 装箱

int j = (int) stack.Pop(); file://拆

拆箱不仅是类型转换的需要,它也是一个无缝处理结构和类之间关系的方式。你要清楚装箱是做了创建包装类的工作,尽管CLR可以为被装箱的对象提供附加的优化。

【译注:可以这么认为,在C#中,对于任何值(结构)类型,都存在如下的包装类:

class T_Box file://T代表任何值类型

{

T Value;

T_Box(T t){Value = t;}

}

当装箱时,比如:

int n = 1;

object box = n;

概念上相当于:

int n = 1;

object box = new int_Box(i);

当拆箱时,比如:

object box = 1;

int n = (int)box;

概念上相当于:

object box = new int_Box(1);

int n = ((int_Box)box).Value;】

【作者注:C#的设计者在设计过程中应该考虑过模板。我怀疑未采用模板有两个原因:第一个是混乱,模板可能很难和面向对象的特性融合在一起,它为程序员的带来了太多的(混乱)设计可能性,而且它很难和反射一起工作;第二点是,如果.NET库(例如集合类)没有使用模板的话,模板将不会太有用。不过,果真.NET类使用了它们,那将有20多种使用.NET类的语言不得不也要能和模板一起工作,这在技术上是非常难以实现的。

注意到模板(泛型)已经被Java社团考虑纳入Java语言规范之中是一件有意思的事。或许每个公司都会各唱各的调—Sun说“.NET患了最小公分母综合症”,而微软则说“Java不支持多语言”。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章