4 回答

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
as
if (randomObject is TargetType tt){ // Use tt here}
tt
if
is
別這么做: // Bad code - checks type twice for no reasonif (randomObject is TargetType){ TargetType foo = (TargetType) randomObject; // Do something with foo}
這不僅是檢查兩次,而且可能是檢查不同的東西,如果 randomObject
是字段而不是局部變量。如果另一個(gè)線程更改 randomObject
在兩者之間。 如果 randomObject
真的 應(yīng)是.的一個(gè)實(shí)例 TargetType
也就是說,如果不是,這意味著有一個(gè)錯(cuò)誤,那么轉(zhuǎn)換是正確的解決方案。這會(huì)立即引發(fā)異常,這意味著在不正確的假設(shè)下不會(huì)做更多的工作,并且異常正確地顯示了錯(cuò)誤的類型。 // This will throw an exception if randomObject is non-null and// refers to an object of an incompatible type. The cast is // the best code if that's the behaviour you want.TargetType convertedRandomObject = (TargetType) randomObject;
如果 randomObject
強(qiáng)權(quán)是.的一個(gè)實(shí)例 TargetType
和 TargetType
是引用類型,然后使用如下代碼: TargetType convertedRandomObject = randomObject as TargetType;if (convertedRandomObject != null){ // Do stuff with convertedRandomObject}
如果 randomObject
強(qiáng)權(quán)是.的一個(gè)實(shí)例 TargetType
和 TargetType
是一個(gè)值類型,那么我們就不能使用 as
帶著 TargetType
本身,但我們可以使用一個(gè)可空類型: TargetType? convertedRandomObject = randomObject as TargetType?;if (convertedRandomObject != null){ // Do stuff with convertedRandomObject.Value}
(注:目前這是 實(shí)際上比is+強(qiáng)制轉(zhuǎn)換慢 ..我認(rèn)為它更優(yōu)雅、更連貫,但我們開始了。) 如果你真的不需要轉(zhuǎn)換值,但你只需要知道它是否 是一個(gè)TargetType的實(shí)例,然后是 is
接線員是你的朋友。在這種情況下,TargetType是引用類型還是值類型并不重要。 可能還有其他涉及泛型的情況 is
是有用的(因?yàn)槟赡懿恢繲是否是引用類型,因此不能用作引用類型),但它們相對(duì)比較模糊。 我?guī)缀蹩隙ㄓ眠^ is
對(duì)于以前的值類型情況,沒有考慮使用可空類型和 as
共:)
using System;using System.Diagnostics;using System.Linq;class Test{ const int Size = 30000000; static void Main() { object[] values = new object[Size]; for (int i = 0; i < Size - 2; i += 3) { values[i] = null; values[i + 1] = "x"; values[i + 2] = new object(); } FindLengthWithIsAndCast(values); FindLengthWithIsAndAs(values); FindLengthWithAsAndNullCheck(values); } static void FindLengthWithIsAndCast(object[] values) { Stopwatch sw = Stopwatch.StartNew(); int len = 0; foreach (object o in values) { if (o is string) { string a = (string) o; len += a.Length; } } sw.Stop(); Console.WriteLine("Is and Cast: {0} : {1}", len, (long)sw.ElapsedMilliseconds); } static void FindLengthWithIsAndAs(object[] values) { Stopwatch sw = Stopwatch.StartNew(); int len = 0; foreach (object o in values) { if (o is string) { string a = o as string; len += a.Length; } } sw.Stop(); Console.WriteLine("Is and As: {0} : {1}", len, (long)sw.ElapsedMilliseconds); } static void FindLengthWithAsAndNullCheck(object[] values) { Stopwatch sw = Stopwatch.StartNew(); int len = 0; foreach (object o in values) { string a = o as string; if (a != null) { len += a.Length; } } sw.Stop(); Console.WriteLine("As and null check: {0} : {1}", len, (long)sw.ElapsedMilliseconds); }}
他們之間沒有明顯的差別。(事實(shí)上,在某些情況下,as-plus-null檢查是肯定的。 是
慢點(diǎn)。上面的代碼實(shí)際上使類型檢查變得容易了,因?yàn)樗轻槍?duì)一個(gè)密封類的;如果您正在檢查一個(gè)接口,那么余額會(huì)稍微傾向于as-plus-null檢查。) 他們都是 瘋狂
快地。這很簡(jiǎn)單 不會(huì)
成為您代碼中的瓶頸,除非您真的不打算這樣做 什么都行
之后的值。
int value;if (int.TryParse(text, out value)){ value = int.Parse(text); // Use value}

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
“AS”
鑄造前
- 4 回答
- 0 關(guān)注
- 677 瀏覽
添加回答
舉報(bào)