第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在CLR中使用“as”關(guān)鍵字對(duì)VS進(jìn)行強(qiáng)制轉(zhuǎn)換

在CLR中使用“as”關(guān)鍵字對(duì)VS進(jìn)行強(qiáng)制轉(zhuǎn)換

呼喚遠(yuǎn)方 2019-06-01 11:39:33
在CLR中使用“as”關(guān)鍵字對(duì)VS進(jìn)行強(qiáng)制轉(zhuǎn)換在編程接口時(shí),我發(fā)現(xiàn)我正在進(jìn)行大量的轉(zhuǎn)換或?qū)ο箢愋娃D(zhuǎn)換。這兩種轉(zhuǎn)換方法有區(qū)別嗎?如果是的話,是否存在成本差異,或者這對(duì)我的項(xiàng)目有何影響?public interface IMyInterface{     void AMethod();}public class MyClass : IMyInterface{     public void AMethod()     {        //Do work     }     // Other helper methods....}public class Implementation{     IMyInterface _MyObj;     MyClass _myCls1;     MyClass _myCls2;     public Implementation()     {         _MyObj = new MyClass();         // What is the difference here:         _myCls1 = (MyClass)_MyObj;         _myCls2 = (_MyObj as MyClass);     }}此外,什么是“一般”的首選方法?
查看完整描述

4 回答

?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

下面的答案是在2008年寫的。

C#7引入了模式匹配,這在很大程度上取代了as運(yùn)算符,正如您現(xiàn)在可以寫的那樣:

if (randomObject is TargetType tt){
    // Use tt here}

請(qǐng)注意tt在此之后仍在范圍內(nèi),但沒有明確分配。(它絕對(duì)分配在if)在某些情況下,這有點(diǎn)煩人,所以如果您真的關(guān)心在每個(gè)作用域中引入盡可能少的變量,您可能仍然希望使用is然后是演員。


到目前為止,我認(rèn)為沒有任何答案(在開始回答的時(shí)候!)已經(jīng)解釋了什么地方值得使用。

  • 別這么做:

    // 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í)例TargetTypeTargetType是引用類型,然后使用如下代碼:

    TargetType convertedRandomObject = randomObject as TargetType;if (convertedRandomObject != null){
        // Do stuff with convertedRandomObject}
  • 如果randomObject 強(qiáng)權(quán)是.的一個(gè)實(shí)例TargetTypeTargetType是一個(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共:)


編輯:請(qǐng)注意,除了Value類型的情況之外,上面沒有提到性能問題,因?yàn)槲乙呀?jīng)注意到,對(duì)可為空的值類型取消裝箱實(shí)際上要慢一些-但是一致的。

根據(jù)NAASK的回答,使用現(xiàn)代的JIT進(jìn)行即時(shí)廣播或空檢查都是一樣快的,如下代碼所示:

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);
    }}

在我的筆記本電腦上,這些都在大約60毫秒內(nèi)執(zhí)行。有兩件事要注意:

  • 他們之間沒有明顯的差別。(事實(shí)上,在某些情況下,as-plus-null檢查是肯定的。

    慢點(diǎn)。上面的代碼實(shí)際上使類型檢查變得容易了,因?yàn)樗轻槍?duì)一個(gè)密封類的;如果您正在檢查一個(gè)接口,那么余額會(huì)稍微傾向于as-plus-null檢查。)
  • 他們都是

    瘋狂

    快地。這很簡(jiǎn)單

    不會(huì)

    成為您代碼中的瓶頸,除非您真的不打算這樣做

    什么都行

    之后的值。

所以我們不用擔(dān)心演出。讓我們擔(dān)心正確性和一致性。

我認(rèn)為,在處理變量時(shí),IS和CAST(或IS和AS)都是不安全的,因?yàn)樗玫闹档念愋涂赡軙?huì)因?yàn)闇y(cè)試和強(qiáng)制轉(zhuǎn)換之間的另一個(gè)線程而改變。這將是一種非常罕見的情況-但我寧愿有一個(gè)我可以始終如一地使用的會(huì)議。

我還堅(jiān)持認(rèn)為,空值檢查可以更好地分離關(guān)注點(diǎn)。我們有一個(gè)嘗試轉(zhuǎn)換的語句,然后一個(gè)使用結(jié)果的語句。is-and cast或is-and-as執(zhí)行一個(gè)測(cè)試,并且然后另一次嘗試轉(zhuǎn)換值。

換一種說法,會(huì)不會(huì)有人從未有過寫:

int value;if (int.TryParse(text, out value)){
    value = int.Parse(text);
    // Use value}

這就是目前正在做的事情-盡管顯然是以一種更便宜的方式。


查看完整回答
反對(duì) 回復(fù) 2019-06-01
?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

“AS”如果不可能進(jìn)行強(qiáng)制轉(zhuǎn)換,將返回NULL。

鑄造前會(huì)引發(fā)一個(gè)例外。

對(duì)于性能而言,提出異常通常會(huì)花費(fèi)更多時(shí)間。


查看完整回答
反對(duì) 回復(fù) 2019-06-01
  • 4 回答
  • 0 關(guān)注
  • 677 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)