IS 和AS
http://www.cnblogs.com/haiyang1985/archive/2009/03/12/1410023.html
1一. as 運算符用于在兼容的引用類型之間執行某些類型的轉換。
static?void?Main(string[]?args)
{
? ??
object[] obj = new object[3];
obj[0] = 10;
Type t = obj[0].GetType();
obj[1] = "hello";
obj[2] = 10;
for (int i = 0; i < obj.Length; i++)
{
string s = obj[i] as string;
if (s != null)
{
Console.WriteLine(s);
}
else
{
Console.WriteLine("not a string");
}
}
Console.ReadLine();
}
結果:
not a string
hello
not a string
==============================================================================
class Base
{
public override string ToString()
{
return "Base";
}
}
class Derived : Base
{ }
?
class Program
{
static void Main()
{
?
Derived d = new Derived();
?
Base b = d as Base;
if (b != null)
{
Console.WriteLine(b.ToString());
}
?
}
}
對于繼承類,允許把子類轉換成父類,但是不可以把父類轉換成子類,不同類之間,值類型不可轉換。
安全性:
as操作符不會做過的轉換操作,當需要轉化對象的類型屬于轉換目標類型或者轉換目標類型的派生類型時,那么此轉換操作才能成功,而且并不產生新的對象【當不成功的時候,會返回null】。因此用as進行類型轉換是安全的。
效率:
當用as操作符進行類型轉換的時候,首先判斷當前對象的類型,當類型滿足要求后才進行轉換,而傳統的類型轉換方式,是用當前對象直接去轉換,而且為了保護轉換成功,要加上try-catch,所以,相對來說,as效率高點。
需要注意的是,不管是傳統的還是as操作符進行類型轉換之后,在使用之前,需要進行判斷轉換是否成功,如下:
| 1 2 3 4 | if(newValue != null) { //Work with the object named “newValue“ } |
===================================================================================
http://www.cnblogs.com/cgli/archive/2011/05/10/2041731.html
is檢查一個對象是否兼容于指定的類型,并返回一個Boolean值:true或者fasle。注意,is操作符永遠不會拋出異常,請看以下示例:
ClassA
{
....
}
Object o=new Object();
Boolean b1=(o is Object); //b1為true.
Boolean b2=(o is ClassA) ; b2為false.
如果對象引用是null,is操作符總是返回false,因為沒有可檢查的其類型的對象。
?is 操作符通常像下面這樣使用:
if(obj is ClassA)
{
??? ClassA a=(ClassA) obj;
?? ...
?}
?在這一段代碼中,CLR實際會檢查兩次對象類型。is操作符首先核實obj是否兼容于ClassA 類型。如果是,那么在if語句內部執行類型轉換時,CLR再次核實obj是否引用一個ClassA。CLR的類型檢查增強了安全性,但也會對性能造成一定的影響。這是因為CLR首先必須判斷(obj)引用的對象的實際類型。然后CLR必須遍歷繼承層次結構,用每個基類型去核對指定的類型(ClassA)。
?
轉載于:https://www.cnblogs.com/ZkbFighting/p/7601020.html
總結
- 上一篇: 将CSS放头部,JS放底部,可以提高页面
- 下一篇: 如何更改github工程的语言属性