C# 中的 is 和 as 运算符 简单举例说明
假设有一个接口: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 运算符 简单举例说明相关推荐
- Java多线程中使用ReentrantLock、synchronized加锁 简单举例
Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...
- C++ 重载运算符简单举例
我们可以重定义或重载大部分 C++ 内置的运算符.这样,就能使用自定义类型的运算符. 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的.与其他函数一 ...
- JavaScript中map函数和filter的简单举例
JavaScript的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似 1> filter是满足条件的留下,是对原数组的过滤: 2> map ...
- JavaScript中几个优雅的运算符使用技巧
ECMAScript发展进程中,会有很多功能的更新,比如销毁,箭头功能,模块,它们极大的改变JavaScript编写方式,可能有些人喜欢,有些人不喜欢,但像每个新功能一样,我们最终会习惯它们.新版本的 ...
- (47)System Verilog 类中变量随机激励inside运算符
(47)System Verilog 类中变量随机激励inside运算符 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机 ...
- 计算机excel2010运算符,Excel 2010 中运算符应用举例
Excel 2010 中运算符应用举例 1. 算术运算符应用举例 算术运算符:+.-.* ./ .^.% 例1"=-5*20+20%*100+4^3/2",这个公式中主要是用算术运 ...
- c语言中自增自减运算符,C语言中自增自减运算符的深入剖析
C语言中自增自减运算符的深入剖析 李文广 李俊荣 赵妍 . (1.沧州职业技术学院,2沧州工贸学校) [摘要]本文从多方面对自增自减运算符分析.讲解,以便让初学者 能够清晰自增自减运算符的运算规律,学 ...
- 13. 找出数组中重复的数字【难度: 简单 / 知识点: 模拟】
13. 找出数组中重复的数字[难度: 简单 / 知识点: 模拟] 方法一: map 计数 时间复杂度O(nlongn) 空间复杂度多了一个二叉树 class Solution {public:int ...
- 单元格内多个姓名拆分成一列_excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!...
excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!,这个问题是我们很多人都很困惑的一个问题,excel单元格拆分是我们非常常用的一个东西,也是我们工作和学习中必不可少的一个数据公式,那么具体 ...
最新文章
- access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化
- 前端学习(1927)vue之电商管理系统电商系统之美化一层循环的UI结构for循环渲染第三层结构
- “今朝安全众测平台”正式启动运行
- 某一年某一年_过去一年里有关开放式组织的5个最受欢迎的故事
- 【BOI2007】【BZOJ1176】Mokia
- oracle成本抛转,抛砖引玉:CBO成本计算初探
- python创意小作品-[专题]在Python教学中应用turtle创意编程实践
- 内存可见性,指令重排序,JIT。。。。。。从一个知乎问题谈起
- 附件 计算机 丢失,帮你找回Win7开始菜单附件丢失的工具
- 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列...
- docker 发布springBoot项目
- 基于R语言的数据分析报告
- Vuepress2.X从0-1保姆级入门教程
- 谷歌浏览器设置主页教程
- Hive之同比环比的计算
- 河北工业大学计算机学院考研真题,河北工业大学考研真题汇总
- IPD(集成产品开发)文一
- Python的编码与解码
- [附源码]Python计算机毕业设计Django的高校资源共享平台
- Anaconda安装Tensorflow-GPU
热门文章
- apply()与call()的区别
- Codis 分布式缓存部署
- 几种开源软件授权协议
- 2021-02-03-延长一天时间的有效方法
- hbase 修改表名_hbase修改表名 - 张欢19933的个人空间 - OSCHINA - 中文开源技术交流社区...
- arithmetic java_Java:Arithmetic
- mysql双主数据一致性_MySQL双主一致性架构优化 | 架构师之路-阿里云开发者社区...
- mcq 队列_人工智能能力问答中的人工智能概率推理(MCQ)
- 使用Linux命令行归档文件
- Java LinkedList公共布尔boolean offerLast(Object o)方法(带示例)