C# 中的 is 和 as 运算符 简单举例说明
假設(shè)有一個(gè)接口:IBankAccount;一個(gè)類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}"$ }正是因?yàn)槔^承關(guān)系,SaverAccount可以直接分配給IBankAccount接口,如下圖所示:
IBankAccount venusAccount = new SaverAccount();如果一個(gè)方法接受一個(gè)對(duì)象類型,現(xiàn)在希望訪問IBankAccount成員,該怎么辦呢?該對(duì)象類型沒有IBankAccount接口成員。此時(shí)可以進(jìn)行類型轉(zhuǎn)換,把對(duì)象(也可以使用任何接口中的任意類型的參數(shù),把它裝化為需要的類型)轉(zhuǎn)化為IBankAccount,再處理它:
public void WorkWithManyDifferentObjects(object o) {IBankAccount account = (IBankAccount)o;//work with the account }只要總是給這個(gè)方法提供一個(gè)IBankAccount類型的對(duì)象,這就是有效的。當(dāng)然,如果接受一個(gè)object類型的對(duì)象,有時(shí)就換傳遞無效的對(duì)象。此時(shí)會(huì)得到InvalidCastException 異常。在正常情況下接受異常從來都不好。此時(shí)應(yīng)該使用 is 和 as 運(yùn)算符。
不是直接進(jìn)行類型的轉(zhuǎn)化,而應(yīng)該檢查參數(shù)是否實(shí)現(xiàn)了接口IBankAccount。as 運(yùn)算符的工作原理類似于層次結(jié)構(gòu)中的 cast運(yùn)算符——它返回對(duì)象的引用。然而,它從不拋出InvalidCastException異常,如果這個(gè)對(duì)象不是所要求的類型,這個(gè)運(yùn)算符就返回null。
public void WorkWithManyDifferentObjects(object o) {IBankAccount account = o as IBankAccount;if( account != null){//work with the account} }?除了使用as運(yùn)算符之外,還可以使用is運(yùn)算符。 is運(yùn)算符根據(jù)條件是否滿足,對(duì)象是否使用指定的類型,返回true或者false.驗(yàn)證條件是true后,可以進(jìn)行類型轉(zhuǎn)換,因?yàn)楝F(xiàn)在,類型轉(zhuǎn)換總會(huì)成功。
public void WorkWithManyDifferentObjects(object o) {if(o is IBankAccount){IBankAccount account = (IBankAccount)o;//work with the account} }?在類層次結(jié)構(gòu)內(nèi)部的類型轉(zhuǎn)換,不會(huì)拋出基于類型轉(zhuǎn)換的異常,而且使用is 和 as 運(yùn)算符都是可以的。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的C# 中的 is 和 as 运算符 简单举例说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中IEnumerableT.Grou
- 下一篇: C#中IEnumerableT.Join