程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 淺析“強制類型轉換”帶來的性能分析及其解決方法

淺析“強制類型轉換”帶來的性能分析及其解決方法

編輯:.NET實例教程

一個“強制轉換”的例子引發的思考:
using System;
class Fruit
{
 //省略
}
class Apple:Fruit
{
 public int i=1;
}
class Conversions
{
 static void Main()
 {
  Fruit f =new Apple();//CLR允許將一個對象實例強制轉換為它的基類型,此轉換是隱式轉換。
  //Apple a=new Fruit();
  // Type t=f.GetType();
  //Console.WriteLine(t.FullName); 查看所屬那個class;
  Console.WriteLine(f.i);//調用出錯
  Apple a=(Apple)f;//強制類型轉換
  Console.WriteLine(a.i);
  //Console.WriteLine(((Apple)f).i);
 }
}
在C Sharp語言中,進行強制類型轉換的另外一種方式是is操作符。is操作符檢測一個對象是否兼容於指定的類型,並返回一個Bool值。請注意:我在MSDN中查過資料,說明is操作符永遠不會拋出異常,從而增加了代碼執行的安全性。如下面例子:
using System;
class Fruit
{
 
}
class Apple:Fruit
{
 public int i=1;
}
class Conversions
{
 static void Main()
 {  
  Fruit f=new Fruit();
  Apple a=new Apple();
  Console.WriteLine(f is Fruit);//返回true
  Console.WriteLine(f is Apple);//返回false
  Console.WriteLine(a is Fruit);//返回true
  Console.WriteLine(a is Apple);//返回true
 }
}
這個很簡單,下面改寫Main()裡面的代碼,慢慢引入有意思的問題:
{  
  Fruit f=new Apple();
  if (f is Apple)
  {
   Apple a=(Apple)f;
   Console.WriteLine(a.i);
  }
}
輸入結果是:1,因為f對象輸入Fruit類,如果直接調用Console.WriteLine(f.i)會出現編譯錯誤,為了能夠調用Apple類裡面的pubilc型 int i,需要強制類型轉換,這裡if語句中的條件起一個判斷作用,道理很簡單,這裡我理解is相當於"包含之意",因為Apple:Fruit,所以需要一個轉換過程,Apple a=(Apple)f;然後在輸出。寫到這裡,問題來了,細心研究的朋友會發現CLR在執行if語句的時候,會兩次類型檢測,從安全性來說,沒有問題,但是從性能來說,就有問題了,如果這種情況多次發生,或者說多次轉換,性能問題......有沒有解決的辦法了?答案是有的。經過我仔細查閱MSDN上面的資料,我們可以用as操作符解決。代碼如下:
Fruit f=new Apple();
Apple a=f as Apple;
if(a!=null)
{
 Console.WriteLine(a.i);
}
說明:as操作符跟is一樣都是返回一個Bool值,一個對象得引用。區別在於as操作符只進行一次對象的引用,並且速度比is操作符快很多,所以性能大大提高。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved