科技行者

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

知识库

知识库 安全导航

至顶网软件频道微软 .NET 在新的平台上编程(二)

微软 .NET 在新的平台上编程(二)

  • 扫一扫
    分享文章到微信

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

   C# 使用as操作符提供另一种方法来实现强制类型转换: Jeff j = new Jeff(); // 创建一个新的Jeff 对象 System.Object o = j as System.Object; // 强制转换 j 为System.Object对象

作者:中国IT实验室 来源:中国IT实验室 2007年9月11日

关键字: 编程

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

C# 使用as操作符提供另一种方法来实现强制类型转换:

Jeff j = new Jeff(); // 创建一个新的Jeff 对象

System.Object o = j as System.Object; // 强制转换 j 为一个System.Object对象

// 现在o 指Jeff 对象
as操作符试图强制转换一个对象为指定的类型。但与通常的强制转换不一样,如果对象的类型强制转换不成功,结果会是null,as操作符决不会掷出异常。当引用有毛病的强制类型转换发生时,将产生NullReferenceException异常。下列代码示范了这种情况。

System.Object o = new System.Object(); //创建一个新的Object 对象

Jeff j = o as Jeff; //强制转换 o 为一个Jeff对象

// 上面的强制转换失败:不会有异常掷出,而j会被置为null

j.ToString(); // 访问j时产生一个NullReferenceException 异常

除了as操作符以外,C#还提供一个is操作符。它检查是否一个对象实例与给定的类型兼容并判断结果是True或是False。Is操作符不会产生异常。

System.Object o = new System.Object();

System.Boolean b1 = (o is System.Object); // b1 是 True

System.Boolean b2 = (o is Jeff); // b2 是 False

注意,如果对象引用是null,is操作符总是返回False,因为得不到对象来检查其类型。

为了肯定你理解了刚才所说的内容,假设下列两各类定义存在。

class B {

int x;

}

class D : B {

int x;

}
    现在,参见图二看看哪一行代码通过编译并执行成功(ES),哪一行代码导致编译器错误(CE),哪一行代码导致公共语言运行时错误(RE)。

    集合与名字空间

    类型集可以被分组成集合(一个或多个文件集)并且被展开。在一个集合中可以只存在单独的名字空间。对应用程序开发人员来说,名字空间就像有关联的类型的逻辑分组。例如,基本类库集合包含许多名字空间。System名字空间包括Object基类型、Byte、Int32、Exception、Math和Delegate之类的核心低级类型,而System.Collections名字空间包括的类型如AarryList、BitAarry、Queue和Stack.

    对于编译器来说,名字空间只不过是名字较长的的类型名,以及其唯一性是用句点分隔某些符号名来保证的。对于编译器而言,System名字空间中的Object类型只不过是用一个叫做System.Object的类型来表示。同样,System.Collections名字空间中的Queue类型简单地用标示符System.Collections.Queue来表示。

    运行时引擎不知道关于名字空间的任何信息。当你访问一个类型时,公共语言运行时只需要知道完整的类型名字以及哪一个集合包含这个类型的定义,以便公共语言运行时能正确加载集合,从而找到要访问的类型并处理之。

    编程人员通常都想用最简练的方法来表达算法,但用完全限定名引用每一个类类型的话极其麻烦。因此,许多编程语言提供一条语句来指示编译器添加各种前缀到类型名,直到实现一个匹配。当用C#编程时,我经常在源代码的最前面是用下面的语句:

    using System;

    当我在代码中引用一个类型时,编译器需要保证这个类型被定义过并且我的代码要以正确的方式访问这个类型。如果编译器不能找到指定的类型,它试图将“System.”添加到类型名并检查产生的类型名字是否与现存的类型名匹配。前面的代码行允许我在代码中使用Object,并且编译器将自动将名字展开为System.Object.我肯定你能轻松想象这样省去了多少键盘输入。

    当进行类型定义的检查时,编译器必须知道哪一个集合包含了这个类型,以便这个集合的信息和类型信息能被送到结果文件中。为了获得集合信息,你必须将定义了任何引用类型的集合传给编译器。

    正如你所设想的一样,这种设计存在一些潜在的问题。为了编程方便,你应该避免创建名字冲突的类型。但是在某些情况中,它完全不可能。。NET鼓励组件重用。你的应用程序可以利用Microsoft所创建的组件,同时,你也可以用Richter创建的另一个组件。这些公司的组件可能都提供了一个叫做FooBar的类型,-Microsoft的FooBar所做的事情与Richter的FooBar所做的事情完全不同。在这种情况下,你无法控制类类型的命名。为了引用Microsoft的FooBar,你使用Microsoft.FooBar,为了引用Richter的FooBar,你使用Richter.FooBar.

 

查看本文来源

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

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

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