假设有一个接口:IBankAccount;一个类SaverAccount,类SaverAccout继承自IBankAccount接口,如下图所示:

public interface IBankAccount
{public interface IBankAccount{void PayIn(decimal amount);bool Withdraw(decimal amount);decimal Balance{get;}}
}public class SaverAccount : IBankAccount
{private decimal _balance;public void PayIn(decimal amount) => _balance += amount;public bool Withdraw(decimal amount){if(_balance >= amount){_balance -= amount;return true;}WriteLine("Withdrawl attempt failed");return false;}public decimal Balance => _balance;public override string ToString() => $"Venus Bank Saver:Balance ={_balance,6:C}"$
}

正是因为继承关系,SaverAccount可以直接分配给IBankAccount接口,如下图所示:

IBankAccount venusAccount = new SaverAccount();

如果一个方法接受一个对象类型,现在希望访问IBankAccount成员,该怎么办呢?该对象类型没有IBankAccount接口成员。此时可以进行类型转换,把对象(也可以使用任何接口中的任意类型的参数,把它装化为需要的类型)转化为IBankAccount,再处理它:

public void WorkWithManyDifferentObjects(object o)
{IBankAccount account = (IBankAccount)o;//work with the account
}

只要总是给这个方法提供一个IBankAccount类型的对象,这就是有效的。当然,如果接受一个object类型的对象,有时就换传递无效的对象。此时会得到InvalidCastException 异常。在正常情况下接受异常从来都不好。此时应该使用 is 和 as 运算符。

不是直接进行类型的转化,而应该检查参数是否实现了接口IBankAccount。as 运算符的工作原理类似于层次结构中的 cast运算符——它返回对象的引用。然而,它从不抛出InvalidCastException异常,如果这个对象不是所要求的类型,这个运算符就返回null。

public void WorkWithManyDifferentObjects(object o)
{IBankAccount account = o as IBankAccount;if( account != null){//work with the account}
}

除了使用as运算符之外,还可以使用is运算符。 is运算符根据条件是否满足,对象是否使用指定的类型,返回true或者false.验证条件是true后,可以进行类型转换,因为现在,类型转换总会成功。

public void WorkWithManyDifferentObjects(object o)
{if(o is IBankAccount){IBankAccount account = (IBankAccount)o;//work with the account}
}

在类层次结构内部的类型转换,不会抛出基于类型转换的异常,而且使用is 和 as 运算符都是可以的。

C# 中的 is 和 as 运算符 简单举例说明相关推荐

  1. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  2. C++ 重载运算符简单举例

    我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...

  3. JavaScript中map函数和filter的简单举例

    JavaScript的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似 1> filter是满足条件的留下,是对原数组的过滤: 2> map ...

  4. JavaScript中几个优雅的运算符使用技巧

    ECMAScript发展进程中,会有很多功能的更新,比如销毁,箭头功能,模块,它们极大的改变JavaScript编写方式,可能有些人喜欢,有些人不喜欢,但像每个新功能一样,我们最终会习惯它们.新版本的 ...

  5. (47)System Verilog 类中变量随机激励inside运算符

    (47)System Verilog 类中变量随机激励inside运算符 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机 ...

  6. 计算机excel2010运算符,Excel 2010 中运算符应用举例

    Excel 2010 中运算符应用举例 1. 算术运算符应用举例 算术运算符:+.-.* ./ .^.% 例1"=-5*20+20%*100+4^3/2",这个公式中主要是用算术运 ...

  7. c语言中自增自减运算符,C语言中自增自减运算符的深入剖析

    C语言中自增自减运算符的深入剖析 李文广 李俊荣 赵妍 . (1.沧州职业技术学院,2沧州工贸学校) [摘要]本文从多方面对自增自减运算符分析.讲解,以便让初学者 能够清晰自增自减运算符的运算规律,学 ...

  8. 13. 找出数组中重复的数字【难度: 简单 / 知识点: 模拟】

    13. 找出数组中重复的数字[难度: 简单 / 知识点: 模拟] 方法一: map 计数 时间复杂度O(nlongn) 空间复杂度多了一个二叉树 class Solution {public:int ...

  9. 单元格内多个姓名拆分成一列_excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!...

    excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!,这个问题是我们很多人都很困惑的一个问题,excel单元格拆分是我们非常常用的一个东西,也是我们工作和学习中必不可少的一个数据公式,那么具体 ...

最新文章

  1. access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化
  2. 前端学习(1927)vue之电商管理系统电商系统之美化一层循环的UI结构for循环渲染第三层结构
  3. “今朝安全众测平台”正式启动运行
  4. 某一年某一年_过去一年里有关开放式组织的5个最受欢迎的故事
  5. 【BOI2007】【BZOJ1176】Mokia
  6. oracle成本抛转,抛砖引玉:CBO成本计算初探
  7. python创意小作品-[专题]在Python教学中应用turtle创意编程实践
  8. 内存可见性,指令重排序,JIT。。。。。。从一个知乎问题谈起
  9. 附件 计算机 丢失,帮你找回Win7开始菜单附件丢失的工具
  10. 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列...
  11. docker 发布springBoot项目
  12. 基于R语言的数据分析报告
  13. Vuepress2.X从0-1保姆级入门教程
  14. 谷歌浏览器设置主页教程
  15. Hive之同比环比的计算
  16. 河北工业大学计算机学院考研真题,河北工业大学考研真题汇总
  17. IPD(集成产品开发)文一
  18. Python的编码与解码
  19. [附源码]Python计算机毕业设计Django的高校资源共享平台
  20. Anaconda安装Tensorflow-GPU

热门文章

  1. apply()与call()的区别
  2. Codis 分布式缓存部署
  3. 几种开源软件授权协议
  4. 2021-02-03-延长一天时间的有效方法
  5. hbase 修改表名_hbase修改表名 - 张欢19933的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. arithmetic java_Java:Arithmetic
  7. mysql双主数据一致性_MySQL双主一致性架构优化 | 架构师之路-阿里云开发者社区...
  8. mcq 队列_人工智能能力问答中的人工智能概率推理(MCQ)
  9. 使用Linux命令行归档文件
  10. Java LinkedList公共布尔boolean offerLast(Object o)方法(带示例)