C# as運算符
as運算符使用下面的語法,把一種類型轉(zhuǎn)換為指定的引用類型:
<operand> as <type>
這只適用于下列情況:
? <operand>的類型是<type>
? <operand>可以隱式轉(zhuǎn)換為<ape>類型
? <operand>可以封箱到<type>類型中
如果不能從轉(zhuǎn)換為<(y/7e>,則表達(dá)式的結(jié)果就是null。
基類到派生類的轉(zhuǎn)換可以使用顯式轉(zhuǎn)換來進(jìn)行,但這并不總是有效的??紤]前面示例中的兩個類ClassA和ClassD,其中ClassD繼承了 ClassA:
class ClassA : IMylnterface {}
class ClassD : ClassA {}
下面的代碼使用as運算符把objl中存儲的ClassA實例轉(zhuǎn)換為ClassD類型:
ClassA objl = new ClassA{};
ClassD obj2 = objl as ClassD;
則obj2的結(jié)果為null。
還可以使用多態(tài)性把ClassD實例存儲在ClassA類型的變量中。下面的代碼演示了這一點,ClassA類型的變量包含ClassD類型的實例,使用as運算符把ClassA類型的變量轉(zhuǎn)換為ClassD類型。
ClassD objl = new ClassD{);
ClassA obj2 = objl;
ClassD obj3 = obj2 as ClassD;
這次obj3最后包含與objl相同的對象引用,而不是null。
因此,as運算符非常有用,下面使用簡單類型轉(zhuǎn)換的代碼會拋出一個異常:
ClassA objl = new ClassA();
ClassD obj2 = (ClassD)objl;
與此代碼等價的as代碼會把null值賦予obj2,不會拋出異常。這表示,下面的代碼在C#應(yīng)用程序中是很常見的:
public void MilkCow(Animal myAnimal)
{
Cow myCow = myAnimal as Cow;
if (myCow != null)
{
myCow.Milk();
}
else
{
WriteLine($"{myAnimal.Name} isn't a cow, and so can it be milked.");
}
}
這要比檢查異常簡單得多!
點擊加載更多評論>>