1. 程式人生 > >C# is和as操作符

C# is和as操作符

索引 我們 lse std 匿名 之間 null max ogr

C# is和as操作符

來源 https://www.cnblogs.com/gsk99/p/4991483.html

is和as操作符

is操作符:檢查對象是否與給定類型兼容。

說明:

1、如果所提供的表達式非空,並且所提供的對象可以強制轉換為所提供的類型而不會導致引發異常,則 is 表達式的計算結果將是 true,否則返回false。

(1):表達式為空:返回false

//表達式為空
object oo = null;
bool isstudent3 = oo is student;

(2):表達式內容不為空,但強制轉換類型時發生異常,返回false

oo = new object();
bool isstudent4 = oo is student;

(3):表達式為null時,並不會拋異常,因為沒有正確的對象來做類型驗證。

2、is操作符只考慮引用轉換、裝箱轉換和取消裝箱轉換。下面的程序都會發生編譯時錯誤(CTE):已知表達式將始終是 true 或始終是 false

int i=5;
if (i is decimal )
{
  //提示:給定表達式始終不是所提供的("decimal")類型
}
if (i is int)
{
  //給定表達式始終為所提供的("int")類型
}

3、不能重載is操作符。

4、"is"或"as"運算符的第一個操作數不能是lambda表達式或匿名表達式。

if ((delegate(int i) { return i; }) is testdelegate)
{
  //提示:"is"或"as"運算符的第一個操作數不能是lambda表達式或匿名表達式
}
if (((x) => { return x; }) is testdelegate)
{
  //提示:"is"或"as"運算符的第一個操作數不能是lambda表達式或匿名表達式
}


as 運算符:用於在兼容的引用類型之間執行轉換
說明:

1、as操作符類似於強制轉換,但又有區別,當對象為null時,不會拋異常而是會返回null。

object _object = null;
student _s = _object as student;

object as student其實相當於_object is student?(student)_object:null;

之所以這樣說,我們可以從兩者的IL代碼中看出些結論:首先我們實例化個基類對象。

object o = new student();

然後分別執行:

(1) o is student,對應IL代碼

.method private hidebysig static void Main(string[] args) cil managed
{
  .entrypoint
  // 代碼大小 18 (0x12)
  .maxstack 2
  .locals init ([0] object o,
  [1] bool isstudent2)
  IL_0000: nop
  IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
  IL_0006: stloc.0
  IL_0007: ldloc.0
  IL_0008: isinst JmTest.ConsoleApplication1.student
  IL_000d: ldnull
  IL_000e: cgt.un
  IL_0010: stloc.1
  IL_0011: ret
} // end of method Program::Main

(2) o as student,對應IL代碼

.method private hidebysig static void Main(string[] args) cil managed
{
  .entrypoint
  // 代碼大小 15 (0xf)
  .maxstack 1
  .locals init ([0] object o,
  [1] class JmTest.ConsoleApplication1.student s2)
  IL_0000: nop
  IL_0001: newobj instance void JmTest.ConsoleApplication1.student::.ctor()
  IL_0006: stloc.0
  IL_0007: ldloc.0
  IL_0008: isinst JmTest.ConsoleApplication1.student
  IL_000d: stloc.1
  IL_000e: ret
} // end of method Program::Main

小結:兩段IL代碼都執行了isinst,它代表的意思是:測試對象引用是否為特定類的實例,在as操作符後面有一個stloc.1它代表的意思是:從計算堆棧的頂部彈出當前值到索引1處的局部變量列表中。從這兩條IL語句的用途可以說明is和as操作符的部分關系。


2、as 運算符只執行引用轉換和裝箱轉換,無法執行其他轉換。下面的代碼是錯誤的:

object _object = null;
student _s = _object as student;
//試圖將一個對象轉換成委托
testdelegate test = _s as testdelegate;

============== End

C# is和as操作符